WPF学习笔记-行为

摘要:
样式和资源字典可以在一定程度上设置界面的属性效果,但这些都是相对静态的。即使是动态的,它们也是首先定义的,效果也不能根据人的操作行为直接设置。

样式和资源字典能在一定范围上设置界面的属性效果,但是这些都是相对的是静态的,即使是动态的,也是先定义好的,无法直接按人的操作行为去设置效果。

这里来实现拖动功能,需要引用System.Windows.Interactivity.dll程序集

一,创建行为

WPF学习笔记-行为第1张WPF学习笔记-行为第2张
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Input;
 9 using System.Windows.Interactivity;
10 using System.Windows.Media;
11 
12 namespace CustomsXW
13 {
14     public class DragInCanvasBehavior : Behavior<UIElement>
15     {
16         private Canvas canvas;
17 
18         protected override void OnAttached()
19         {
20             base.OnAttached();
21 
22            //鼠标左键按下,移动,左键松开     事件 
23             this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
24             this.AssociatedObject.MouseMove += AssociatedObject_MouseMove;
25             this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
26         }
27 
28         protected override void OnDetaching()
29         {
30             base.OnDetaching();
31 
32        
33             this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;
34             this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
35             this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;
36         }
37 
38         // 是否拖动中
39         private bool isDragging = false;
40 
41         // 鼠标点位置元素
42         private Point mouseOffset;
43 
44         private void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
45         {
46             // 获取画板
47             if (canvas == null) canvas = VisualTreeHelper.GetParent(this.AssociatedObject) as Canvas;
48 
49             // 开始拖动准备
50             isDragging = true;
51 
52             //获取当前元素的点位置,默认右上坐标0,0
53           
54             mouseOffset = e.GetPosition(AssociatedObject);
55 
56             // 捕获鼠标
57             AssociatedObject.CaptureMouse();
58         }
59 
60         private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
61         {
62             if (isDragging)
63             {
64                 // 拖动中,一直实时获取画板的点位置
65                 Point point = e.GetPosition(canvas);
66 
67                 // 实时在画板的上设置元素点位置
68                 AssociatedObject.SetValue(Canvas.TopProperty, point.Y - mouseOffset.Y);
69                 AssociatedObject.SetValue(Canvas.LeftProperty, point.X - mouseOffset.X);
70             }
71         }
72 
73         private void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
74         {
75             if (isDragging)
76             {
77                 //移动结束,松开鼠标,释放捕获鼠标
78                 AssociatedObject.ReleaseMouseCapture();
79                 isDragging = false;
80             }
81         }
82     }
83 }
View Code

二,使用行为

记得要引用

WPF学习笔记-行为第3张WPF学习笔记-行为第4张
 1 <Window x:Class="WPFdemo13.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:WPFdemo13"
 7         mc:Ignorable="d"
 8         xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
 9         xmlns:custom="clr-namespace:CustomsXW;assembly=CustomsXW"
10         Title="MainWindow" Height="350" Width="525">
11     <Grid>
12         <Canvas>
13             <Rectangle Height="30" Width="30" Stroke="Black" Fill="Red">
14                 <i:Interaction.Behaviors>
15                     <custom:DragInCanvasBehavior></custom:DragInCanvasBehavior>
16                     <!--有时候初次加载一直会提示错误,需要重启-->
17                 </i:Interaction.Behaviors>
18 
19             </Rectangle>
20             
21         </Canvas>
22 
23     </Grid>
24 </Window>
View Code

效果:

WPF学习笔记-行为第5张

免责声明:文章转载自《WPF学习笔记-行为》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Eclipse的设置【JAVA】POI生成EXCEL图表(柱状图、折线等)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

html5中的Canvas对图片的一些修改

先展示一下效果: 左边是处理前的原图,右边是经过canvas处理之后的效果。 html代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title><...

Layui upload 上传有进度条

首先需要下载最新的 layui的js layui 有进度条是在 2.5.5的时候添加了进度条的功能,所有在也不用 xhr:function了 1、前台HTML <link href="~/Scripts/layui/css/layui.css" rel="stylesheet" /> <script src="~/Scripts/layu...

H5动画开发快车道

前言 以往做一些H5的运营项目,都是动画设计师使用Animate cc(原来的Flash)先设计好动画原型,然后交给我们UI开发来实现。做过动画开发的童鞋都知道动画开发都是比较耗费时间精力的,而且还要高质量的还原动画设计师设计好的动画,来回沟通成本也非常高。 那有没有一种高效的方法来改善这种流程,提高开发效率的同时还能完成高品质的动画呢? 经过一段时间的摸...

学习WPF——了解WPF中的XAML

XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Button对象 XAML可以在一个元素中嵌套另一个元素,例如Grid元素可以嵌套Button元素   了解XAML VisualStudio创建一个窗口,默认...

WPF编程宝典P18----ColorPicker 和FlipPanel的讲解

一,ColorPicker的实现 1,自定义属性 #region ColorPick Of the Book [TemplatePart(Name = "PART_RedSlider", Type = typeof(RangeBase))] [TemplatePart(Name = "PART_BlueSlider", Type = t...

WPF布局(3)坐标(转)

在动态定位布局时,经常需要获取控件或鼠标的相对位置,WPF提供了这样的函数可以我们使用。 1、获取元素相对于父控件的位置使用Vector VisualTreeHelper.GetOffset(Visual visual)方法,返回visual在其父控件中的偏移量,然后你再将返回值的Vector对象转换成Point对象2、获取元素相对于祖宗控件或子孙控件的位...