zoukankan      html  css  js  c++  java
  • WPF中实现砖块拖动的方法(2)

    这篇文章解决一下上一篇中剩下的问题,拖动的过程中,按钮的位置实时更新。

    本来是看的微软提供的例子,例子里面是使用的AdornerLayer来实现的,实现了一个Adorner类,但实际上不需要那么复杂,确定鼠标按下,然后拖动过程中实时更新控件位置,跟鼠标放开的时候做的事是一样的。

    代码如下:

    private bool _isDown;
    
    #region canvas的事件
    //鼠标左键按下事件
    private void canvas1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
       _isDown = true;
    }
    
    /// <summary>
    /// 鼠标左键弹起事件,是以鼠标左键按下为前提的
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void canvas1_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
       UpdatePosition(e.Source as UIElement);
       _isDown = false;
    }
    
    /// <summary>
    /// 鼠标移动事件,是以鼠标左键按下为前提的
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void canvas1_PreviewMouseMove(object sender, MouseEventArgs e)
    {
       if (!_isDown)
         return;
       UpdatePosition(e.Source as UIElement);
    }
    #endregion
    
    /// <summary>
    /// 控件位置更新
    /// </summary>
    /// <param name="ui"></param>
    private void UpdatePosition(UIElement ui)
    {
       Point CurrentPosition = System.Windows.Input.Mouse.GetPosition(canvas1);
       Canvas.SetTop(ui, CurrentPosition.Y);
       Canvas.SetLeft(ui, CurrentPosition.X);
    }

    根据鼠标的位置来更新控件的位置,还是有点不太准确,微软的例子里面的AdornerLayer是来计算按钮实际位置跟鼠标位置的偏移量的,我的理解有误,微软的demo代码,点击这里查看。

  • 相关阅读:
    oracle 安装
    C++中 接口的定义 COM
    linux查看及改变运行级别
    BSD Apache GPL LGPL MIT
    DES MAC PIN HEX
    c语言字符输出格式化
    oracle
    Windows C++ 子目录数量
    GetProcAddress 宏
    How do I install Adobe Flash on Debian Wheezy?
  • 原文地址:https://www.cnblogs.com/jinshizuofei/p/3417206.html
Copyright © 2011-2022 走看看