WPF在屏幕上移动边框

时间:2015-05-11 15:01:33

标签: c# wpf

我制作了一个游戏库存系统,其中我有一个网格,占据网格空间的边框有一个图标的背景图像。例如,在网格位置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");
        }
    }

1 个答案:

答案 0 :(得分:1)

这并不容易,所以我会给你一些步骤:

  1. 你应该知道细胞的大小,然后你就可以计算出每个细胞的位置。

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

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

  4. 当您删除项目时,计算您所在的单元格(可能甚至有一个函数来获取光标下的控件)并执行剩下的逻辑。

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

    尝试这样的事情:

    <Grid>
        <Border x:Name="DragContainer" Width="40" Height="40" />
    
        <!-- OTHER STUFF - YOUR GRID WITH ITEMS -->
    </Grid>
    

    并仅修改Border的保证金。

    另一种方法是在Canvas内拖动,然后您就可以设置Canvas.LeftCanvas.Top - 它应该可以正常工作。

    <Canvas>
        <Border x:Name="DragContainer" Width="40" Height="40" />
    
        <!-- OTHER STUFF - YOUR GRID WITH ITEMS -->
    </Canvas>