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/archive/2012/01/12/2320035.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF经典教程.pdf》是一本关于WPF(Windows Presentation Foundation)的经典教程WPF是微软开发的一种基于.NET Framework的用户界面框架,用于创建丰富、现代化的应用程序界面。 该教程系统地介绍了WPF的各个方面,包括界面设计、布局、控件、数据绑定、图形和动画等等。读者可以通过学习这本教程,掌握WPF开发的基本概念和技巧。 首先,教程开始介绍了WPF的基本概念和体系结构,让读者了解WPF与传统窗体应用程序的区别和优势。接着,教程深入讲解了WPF的布局和控件系统,包括StackPanel、Grid、WrapPanel等常用布局控件,以及Button、TextBox、ComboBox等常见控件的使用方法。 教程还详细介绍了WPF的数据绑定机制,这是WPF开发中非常重要的一个特性,可以通过数据绑定实现界面和数据的自动更新。教程演示了如何将数据源与控件进行绑定,并演示了常见的数据绑定技巧和用法。 此外,教程还讲解了WPF的图形和动画功能,包括使用Path、Rectangle、Ellipse等绘图元素绘制图形,以及使用Storyboard创建各种动画效果。读者可以通过这部分内容学习如何为应用程序添加吸引人的界面和动态效果。 总之,《WPF经典教程.pdf》是学习WPF开发的一本重要参考书,通过系统地学习其中的知识,读者可以快速掌握WPF的基本原理和常用技巧,从而开发出功能强大、界面美观的应用程序。无论是初学者还是有一定经验的开发者,都可以从这本教程中收获丰富的知识和经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值