首页 > 解决方案 > 如何随鼠标 WPF 一起移动控件?

问题描述

我正在制作一个 Space Invaders 克隆,您可以在其中用鼠标控制您的飞船。我找到了拖放控件的在线解决方案,该解决方案有效,但我无法将其翻译为仅用鼠标移动控件。

 private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        Mothership.Body.Margin = new Thickness(Mouse.GetPosition(gridSpace).X, Mouse.GetPosition(gridSpace).Y, 0, 0);
    }

为了澄清,我希望船的(图像控制)位置正好是光标所在的位置,没有偏移。我什至不知道这个偏移量来自哪里或如何获得它。

这是我的鼠标移动的截图,你可以看到图像本身离实际光标很远。我该如何解决?如果您需要更多信息,我会尽力提供。图片

标签: c#wpf

解决方案


我猜你在网格内的图像控件有HorizontalAlignment="Stretch"VerticalAlignment="Stretch"(默认值),这会导致不需要的偏移。因此,正如 Clemens 建议的那样,您必须使用画布。否则,如果您无法更改父控件,请设置图像HorizontalAlignment="Left"VerticalAlignment="Top"并且您的代码将起作用。但正如 Clemens 和 Ostas 建议的那样,按边距移动对象不是一个好方法,如果你必须使用网格,你可以使用 a TranslateTransform(另见此

所以只需设置RenderTransform图像控件的属性并将其XY属性设置在Window_MouseMove.

示例 xml:

<Grid x:Name="gridSpace">
    <Image x:Name="Body" Source="*.png" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Top">
        <Image.RenderTransform>
            <TranslateTransform x:Name="mTransform"/>
        </Image.RenderTransform>
     </Image>
</Grid>

示例代码:

private void Window_MouseMove(object sender, MouseEventArgs e)
{
   //Body.Margin = new Thickness(Mouse.GetPosition(gridSpace).X, Mouse.GetPosition(gridSpace).Y, 0, 0);
   Point pos = e.GetPosition(gridSpace);
   mTransform.X = pos.X;
   mTransform.Y = pos.Y;
}

推荐阅读