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,看看结果!

 

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

原文地址:https://www.cnblogs.com/KingWorld/p/2320035.html