C# 运行时在窗体上拖动控件

C# 运行时在窗体上拖动控件,c#,wpf,windows,controls,drag-and-drop,C#,Wpf,Windows,Controls,Drag And Drop,我刚刚开始使用WPF。但是我正在尝试添加代码(来自Winforms),使用户可以在运行时拖动任意控件。但我似乎无法得到鼠标的当前位置。。。嗯??没有鼠标的位置?:(我认为在WPF中获取此信息的方法是使用一些附加的事件。您可以进入PreviewMouseDown、PreviewMouseMove和PreviewMouseUp的事件处理程序,在鼠标位于某些控件上并且用户按下/释放鼠标按钮、移动鼠标等时获取有关鼠标的信息 这里有一个很好的实例:在鼠标事件中,您可以使用e.GetPosition获取当前

我刚刚开始使用WPF。但是我正在尝试添加代码(来自Winforms),使用户可以在运行时拖动任意控件。但我似乎无法得到鼠标的当前位置。。。嗯??没有鼠标的位置?:(

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


这里有一个很好的实例:

在鼠标事件中,您可以使用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>

我不知道为什么它不正确,但它对我有用

private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    moving = true;
}

private void Button_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    moving = false;
}

private void Button_PreviewMouseMove(object sender, MouseEventArgs e)
{
    if (moving)
    {
        Canvas.SetTop(this, e.GetPosition(Parent as Canvas).Y);
        Canvas.SetLeft(this, e.GetPosition(Parent as Canvas).X);
    }
}
private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    moving = true;
}

private void Button_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    moving = false;
}

private void Button_PreviewMouseMove(object sender, MouseEventArgs e)
{
    if (moving)
    {
        Canvas.SetTop(this, e.GetPosition(Parent as Canvas).Y);
        Canvas.SetLeft(this, e.GetPosition(Parent as Canvas).X);
    }
}