c# - 如何随鼠标 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);
}
为了澄清,我希望船的(图像控制)位置正好是光标所在的位置,没有偏移。我什至不知道这个偏移量来自哪里或如何获得它。
这是我的鼠标移动的截图,你可以看到图像本身离实际光标很远。我该如何解决?如果您需要更多信息,我会尽力提供。图片
解决方案
我猜你在网格内的图像控件有HorizontalAlignment="Stretch"
和VerticalAlignment="Stretch"
(默认值),这会导致不需要的偏移。因此,正如 Clemens 建议的那样,您必须使用画布。否则,如果您无法更改父控件,请设置图像HorizontalAlignment="Left"
,VerticalAlignment="Top"
并且您的代码将起作用。但正如 Clemens 和 Ostas 建议的那样,按边距移动对象不是一个好方法,如果你必须使用网格,你可以使用 a TranslateTransform
(另见此)。
所以只需设置RenderTransform
图像控件的属性并将其X
和Y
属性设置在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;
}
推荐阅读
- curl - 为什么 Google Drive curl 请求的上传速度通常比 Google Chrome 拖放上传快得多?
- testing - 我应该使用哪种方法来测试 golang 中的 func main()?
- react-native - 使用 React Native 导入任何依赖项时出错
- emacs - 你能用emacs用普通的lisp编程吗?
- java - 我尝试连接 192.168.1.20/localhost/10.0.2.2 但无法正常工作
- jquery - 如何在跨度类单击中获取 li 的数据 ID
- python - FailedPreconditionError(参见上面的回溯):尝试使用未初始化的值 rnn/gru_cell/gates/kernel
- python - 如何将多个用户输入添加到文本文件?
- python - 从 Github API 解码 base64 内容
- mobile - 如何创建 M-dot 网站?