我制作了一个游戏库存系统,其中我有一个网格,占据网格空间的边框有一个图标的背景图像。例如,在网格位置0,0中,我有一个带有健康药水背景的边框。我希望能够将此边框拖动到任何其他网格位置。现在,我正在点击并拖动边框以跟随鼠标。
到目前为止我的作品有多少但不是真的。当我左键单击图标并缓慢移动时,有点吓坏了。但是我可以快速移出图标而且它不会跟上,所以它会停止移动,直到我重新开始。关于如何获得这种功能的任何想法?
public partial class MainWindow : Window
{
TranslateTransform trans = new TranslateTransform();
Border border;
public MainWindow()
{
InitializeComponent();
// create a broder and set it's background image
border = new Border();
border.Visibility = System.Windows.Visibility.Visible;
var img = (Image)MasterGrid.FindResource("notepad");
var imgBrush = new ImageBrush(img.Source);
border.Background = imgBrush;
border.Margin = new Thickness(2.0);
// add the border to the grid
Grid.SetRow(border, 0);
Grid.SetColumn(border, 1);
Grid.SetRowSpan(border, 2);
Grid.SetColumnSpan(border, 1);
InvGrid.Children.Add(border);
// hook up events
_00.MouseUp += new System.Windows.Input.MouseButtonEventHandler(_00_MouseUp);
border.MouseDown += border_MouseDown;
border.MouseMove += border_MouseMove;
}
void border_MouseMove(object sender, MouseEventArgs e)
{
// make the border follow the mouse position
trans.X = e.GetPosition(border).X;
trans.Y = e.GetPosition(border).Y;
}
void border_MouseDown(object sender, MouseButtonEventArgs e)
{
border.RenderTransform = trans;
}
private void _00_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
MessageBox.Show("test");
}
}
答案 0 :(得分:1)
这并不容易,所以我会给你一些步骤:
你应该知道细胞的大小,然后你就可以计算出每个细胞的位置。
准备一个容器(例如网格),仅用于移动目的。
当您开始拖动时,将项目放入容器(2.)中,在光标下设置其位置并隐藏单元格的内容。
当您删除项目时,计算您所在的单元格(可能甚至有一个函数来获取光标下的控件)并执行剩下的逻辑。
我不确定在常规控件的情况下是否可以拖动,也许您必须用Canvas替换Grid。
尝试这样的事情:
<Grid>
<Border x:Name="DragContainer" Width="40" Height="40" />
<!-- OTHER STUFF - YOUR GRID WITH ITEMS -->
</Grid>
并仅修改Border的保证金。
另一种方法是在Canvas
内拖动,然后您就可以设置Canvas.Left
,Canvas.Top
- 它应该可以正常工作。
<Canvas>
<Border x:Name="DragContainer" Width="40" Height="40" />
<!-- OTHER STUFF - YOUR GRID WITH ITEMS -->
</Canvas>