在运行时拖动窗体上的控件

我刚开始使用WPF。 但我试图添加我的代码(从Winforms),使用户可以拖动任何他们希望在运行时控制。 但我似乎无法得到鼠标的当前位置…呃? 没有鼠标的位置? 🙁

Solutions Collecting From Web of "在运行时拖动窗体上的控件"

在Mouse事件中,您可以使用e.GetPosition获取当前的鼠标位置。 这个函数可以提供相对于特定元素的鼠标位置,或者你可以传递null。

这是一个非常简单的例子,没有命中测试或任何东西,只是一个可以拖动的按钮。 而且我使用了一个画布来保持简短,但是如果使用变换并将控件转换到所需的位置,可能会更好。

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Canvas PreviewMouseLeftButtonDown="Canvas_PreviewMouseLeftButtonDown" PreviewMouseMove="Canvas_PreviewMouseMove" PreviewMouseLeftButtonUp="Canvas_PreviewMouseLeftButtonUp"> <Button Name="dragButton" Width="80" Height="21" Canvas.Left="50" Canvas.Top="10">Drag Me!</Button> </Canvas> </Window> 

 using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace WpfApplication1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private Point _startPoint; private bool _dragging = false; private void Canvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (dragButton.CaptureMouse()) { _startPoint = e.GetPosition(null); _dragging = true; } } private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e) { if (_dragging) { Point newPoint = e.GetPosition(null); double dx = newPoint.X - _startPoint.X; double dy = newPoint.Y - _startPoint.Y; Canvas.SetLeft(dragButton, Canvas.GetLeft(dragButton) + dx); Canvas.SetTop(dragButton, Canvas.GetTop(dragButton) + dy); _startPoint = newPoint; } } private void Canvas_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (_dragging) { _dragging = false; dragButton.ReleaseMouseCapture(); } } } } 

我认为在WPF中获取这些信息的方法是使用一些附加事件。 您可以进入PreviewMouseDown,PreviewMouseMove和PreviewMouseUp的事件处理程序,以获取有关鼠标超过某些控件时的信息,并且用户正在按/释放鼠标按钮,移动鼠标等。

这里有一个很好的实例: 通用的WPF拖放式装饰器