• WPF教程.002


    让窗口动起来:

    背景:因为使用了WindowStyle = “None”,所以窗口无法移动了;

    需求:现在让我们为K3WindowHeader添加一些代码,从而让用户可以延续传统的鼠标拖拽窗口标题方式移动窗口;

    实现:

    捕获三个鼠标事件:

    this.borderRoot.MouseLeftButtonDown += new MouseButtonEventHandler(BorderRoot_MouseLeftButtonDown);
    this.borderRoot.MouseMove += new MouseEventHandler(BorderRoot_MouseMove);
    this.borderRoot.MouseLeftButtonUp += new MouseButtonEventHandler(BorderRoot_MouseLeftButtonUp);

    添加事件处理代码:

    #region >>>>> 内部变量 ...
    bool _isMouseLeftButtonDown = false;
    Point _pointMouseLeftButtonOriginal = new Point(0, 0);
    #endregion

    void BorderRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _isMouseLeftButtonDown = true;
        _pointMouseLeftButtonOriginal = PointToScreen(e.GetPosition(this));
        this.borderRoot.CaptureMouse();
    }

    void BorderRoot_MouseMove(object sender, MouseEventArgs e)
    {
        if (_isMouseLeftButtonDown)
        {
            Window winParent = (this.Parent as Grid).Parent as Window;

            Point pointCurrent = PointToScreen(e.GetPosition(this));
            winParent.Left += pointCurrent.X - _pointMouseLeftButtonOriginal.X;
            winParent.Top += pointCurrent.Y - _pointMouseLeftButtonOriginal.Y;
            _pointMouseLeftButtonOriginal = pointCurrent;
        }
    }

    void BorderRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        _isMouseLeftButtonDown = false;
        this.borderRoot.ReleaseMouseCapture();
    }

    注:

    我将最外层 Border 命名为borderRoot。逻辑不多说了。CaptureMouse() 和 ReleaseMouseCapture() 也很重要!

    F5,看看结果!

    上面为了尽快看到结果,再一次使用了hard code方式找到父窗口,现在换个通用的方式,否则总有点“鱼鲠在喉,芒刺在背”的感觉。

    记得我们还有个K3Helper工程吧,在这里我们创建一个K3Common类,并在其中实现一个静态方法,由它来沿着指定对象的 Visual Tree 上行,找到符合条件的Parent。

    using System.Windows;  // 这个需要引入WindowsBase
    using System.Windows.Media; // 这个需要引入PresentationCore

    namespace K3Helper
    {
        public class K3Common
        {
            public static DependencyObject GetVisualParent<T>(DependencyObject source)
            {
                while ((source != null) && (source.GetType() != typeof(T)) && !(source is T))
                {
                    source = VisualTreeHelper.GetParent(source);
                }

                return source;
            }
        }
    }

    好了,重新修正一下MouseMove部分代码:

    void BorderRoot_MouseMove(object sender, MouseEventArgs e)
    {
        if (_isMouseLeftButtonDown)
        {
            DependencyObject objParent = K3Helper.K3Common.GetVisualParent<Window>(this);

            if (objParent != null)
            {
                Window winParent = objParent as Window;
                Point pointCurrent = PointToScreen(e.GetPosition(this));
                winParent.Left += pointCurrent.X - _pointMouseLeftButtonOriginal.X;
                winParent.Top += pointCurrent.Y - _pointMouseLeftButtonOriginal.Y;
                _pointMouseLeftButtonOriginal = pointCurrent;
            }
        }
    }

    F5,看看结果!

     

    写东西好累,好在今天的电视节目还不错(江苏卫视),边看边写,^_^

  • 相关阅读:
    P1456 Monkey King
    P3377 【模板】左偏树(可并堆)
    P1074 靶形数独
    P1120 小木棍
    P5490 【模板】扫描线
    糖糖别胡说,我真的不是签到题目
    最长公共子序列
    最长上升子序列
    数的三次方根
    地、颜色、魔法(dfs)
  • 原文地址:https://www.cnblogs.com/KingWorld/p/2320035.html
Copyright © 2020-2023  润新知