• 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代码,点击这里查看。

  • 相关阅读:
    阅读ARm芯片手册 阅读方法
    Linux驱动mmap内存映射
    Linux下inotify的基本使用及注意事项
    网络视频监控与人脸识别
    Linux pci驱动源码
    Verilog语法
    跟着我从零开始入门FPGA(一周入门XXOO系列)-1、Verilog语法
    周立功-我的25年嵌入式生涯
    Linux 进程学习
    [转]MFC下关于“建立空文档失败”问题的分析
  • 原文地址:https://www.cnblogs.com/jinshizuofei/p/3417206.html
Copyright © 2020-2023  润新知