WPF移动Window窗体(鼠标点击左键移动窗体自定义行为)

XAML代码部分:1、引用System.Windows.Interactivity

        2、为指定的控件添加一个拖动的行为

        3、很简单的了解行为的作用和用法

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
        xmlns:behavior="clr-namespace:SDT.Client.Behaviors"
        x:Class="SDT.Client.MainWindow"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None">
    <Rectangle Fill="#FFEE602B" HorizontalAlignment="Left" Height="39" Margin="10,10,0,0" Stroke="Black" VerticalAlignment="Top" Width="497">
        <i:Interaction.Behaviors>
            <behavior:MouseDragWindowBehavior />
        </i:Interaction.Behaviors>
    </Rectangle>
</Window>

 

自定义行为代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interactivity;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace SDT.Client.Behaviors
{
    /// <summary>
    /// 鼠标点击左键移动窗体自定义行为
    /// </summary>
    public class MouseDragWindowBehavior : Behavior<FrameworkElement>
    {
        public MouseDragWindowBehavior()
        {
            /* 在创建WPF自定义窗体时,往往会取消默认的窗体样式,
             * 那么当WindowStyle设置为None时,
             * 需要移动窗体时就必需对某一个UIElement控件进去指定的DragMove操作;
             * 
             * 下面就为指定的控件绑定一个点击左键事件移动窗体的行为
             */
        }
        private Window m_CurrentWindow;

        protected override void OnAttached()
        {
            base.OnAttached();
            //为行为对象添加一个模拟移动的点击事件
            this.AssociatedObject.PreviewMouseLeftButtonDown += OnDragMove;
        }

        private void OnDragMove(object sender, MouseButtonEventArgs e)
        {
            //获取鼠标坐标
            Point position = e.GetPosition(AssociatedObject);
            //鼠标坐标在控件范围内运行移动窗体
            if (position.X < AssociatedObject.ActualWidth && position.Y < AssociatedObject.ActualHeight)
            {
                //获取当前附加行为的控件所在窗体(Window对象)
                if (m_CurrentWindow == null)
                {
                    m_CurrentWindow = Window.GetWindow(AssociatedObject);
                }
                m_CurrentWindow.DragMove();
            }
        }
    }
}

 

posted @ 2016-05-26 15:16  fujc2dev  阅读(1697)  评论(0编辑  收藏  举报