在桌面上拖动WPF表单

我正在尝试制作ac#WPF表单,我可以通过单击它并用鼠标移动来将其拖动到屏幕上。 forms特征包括完全透明且仅包含一个图像。 这就是说窗口样式为none,它不会显示在任务栏中。 因此,当应用程序运行时,您基本上可以看到的只是一个小图像 – 理想情况下,如果我单击并按住鼠标左键并将其移动,我希望能够将其拖动到桌面上。

有谁知道一个简单的方法,我可以完成这个或我忽略了function的构建?

谢谢。

您可以在窗口的鼠标按下事件中使用Window.DragMove方法。

以前的答案取决于答案,但完整的例子是这样的:

private void Window_MouseDown(object sender, MouseButtonEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { DragMove(); } } 

这是一些简单的代码,用于在屏幕上拖动WPF表单。 你可能已经在不同的post上看到了一些代码,我只是修改它以适应拖动WPF表单的需要。

请记住,我们需要抓住MouseLeftButtonDown上的表单位置,这样我们就可以将鼠标指针放在表单上的同一位置,就像我们在屏幕上拖动它一样。

您还需要添加以下引用以获取相对于屏幕的鼠标位置:System.Windows.Forms

需要的属性:

 private bool _IsDragInProgress { get; set; } private System.Windows.Point _FormMousePosition {get;set;} 

码:

  protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { this._IsDragInProgress = true; this.CaptureMouse(); this._FormMousePosition = e.GetPosition((UIElement)this); base.OnMouseLeftButtonDown(e); } protected override void OnMouseMove(MouseEventArgs e) { if (!this._IsDragInProgress) return; System.Drawing.Point screenPos = (System.Drawing.Point)System.Windows.Forms.Cursor.Position; double top = (double)screenPos.Y - (double)this._FormMousePosition.Y; double left = (double)screenPos.X - (double)this._FormMousePosition.X; this.SetValue(MainWindow.TopProperty, top); this.SetValue(MainWindow.LeftProperty, left); base.OnMouseMove(e); } protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) { this._IsDragInProgress = false; this.ReleaseMouseCapture(); base.OnMouseLeftButtonUp(e); } 

如果你像我一样希望对DoDragMove()有更多的控制 – 说,为了让窗口始终保持在当前桌面的边框,我已经做到了。

用法:

 public partial class MainWindow : Window { private WindowsDragger _dragger; public MainWindow() { InitializeComponent(); _dragger = new WindowsDragger(this); } } 

助手class级:

 class WindowsDragger { private readonly Window _window; private Point _dragDelta; public WindowsDragger(Window window) { _window = window; _window.MouseLeftButtonDown += MouseLeftButtonDown; _window.MouseLeftButtonUp += MouseLeftButtonUp; _window.MouseMove += MouseMove; } void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { _dragDelta = e.GetPosition(_window); Mouse.Capture(_window); } void MouseMove(object sender, MouseEventArgs e) { if (Equals(_window, Mouse.Captured)) { var pos = _window.PointToScreen(e.GetPosition(_window)); var verifiedPos = CoerceWindowBound(pos - _dragDelta); _window.Left = verifiedPos.X; _window.Top = verifiedPos.Y; } } void MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (Equals(_window, Mouse.Captured)) Mouse.Capture(null); } private Vector CoerceWindowBound(Vector newPoint) { // Snap to the current desktop border var screen = WpfScreen.GetScreenFrom(_window); var wa = screen.WorkingArea; if (newPoint.X < wa.Top) newPoint.X = wa.Top; if (newPoint.Y < wa.Left) newPoint.Y = wa.Left; if (_window.Width + newPoint.X > wa.Right) newPoint.X = wa.Right - _window.Width; if (_window.Height + newPoint.Y > wa.Bottom) newPoint.Y = wa.Bottom - _window.Height; return newPoint; } } 

WpfScreen来自这里: 如何在WPF中获取当前屏幕的大小?

在Windows加载或网格加载事件上,您可以使用委托来触发DragMove()函数。

`private void Grid_Loaded(object sender,RoutedEventArgs e){

  this.MouseDown += delegate{DragMove();}; }`