2015-05-11 106 views
1

我正在制作一个游戏库存系统,其中我有一个网格和边框,占据网格空间有一个图标的背景图像。例如,在网格位置0,0中,我有一个带有健康药水背景的边框。我希望能够将此边框拖到任何其他网格位置。现在我正在努力点击并拖动边框来跟随鼠标。WPF在屏幕上移动的边框

我到目前为止有些作品,但不是真的。如果我点击图标并缓慢移动,就会感到不适。不过,我可以快速移出图标,但它不能跟上,所以它会停止移动,直到我回来。关于如何获得这种功能的任何想法?

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"); 
     } 
    } 

回答

1

这不是那么容易的,所以我会给你一些步骤:

  1. 你应该知道细胞的大小,那么你就能够计算出每一个位置。

  2. 准备一个容器(例如一个网格),它将仅用于移动目的。

  3. 当您开始拖动时,将项目放入容器(2.)中,将其位置设置在光标下并隐藏单元格的内容。

  4. 当你删除该项目时,计算你是哪个单元格(也许甚至有一个函数来获得光标下的控件)并执行其余的逻辑。

我不确定在常规控件的情况下是否可以拖动,也许你必须用Canvas替换你的Grid。

尝试这样:

<Grid> 
    <Border x:Name="DragContainer" Width="40" Height="40" /> 

    <!-- OTHER STUFF - YOUR GRID WITH ITEMS --> 
</Grid> 

和修改只有边框的保证金。

另一种方法是拖动里面的Canvas,然后你就可以设置Canvas.Left,Canvas.Top - 它应该可以正常工作。

<Canvas> 
    <Border x:Name="DragContainer" Width="40" Height="40" /> 

    <!-- OTHER STUFF - YOUR GRID WITH ITEMS --> 
</Canvas> 
+0

@ user441521它回答你的问题吗? –