- A+
所属分类:.NET技术
WPF中行为(Behavior)的简单使用
在我之前的 WPF 开发中,需要实现一些页面效果时,常使用到的方式就是重写元素的样式(Style),然后再样式里面设置使用元素的各类触发器(Trigger)来实现效果。这样常常需要编写大量的代码。
近日学习到 WPF 中有一个叫做 Behavior 的扩展方式,可以用来实现页面效果,实现方式更为简便。学习笔记如下:
添加需要的DLL库
要使用 Behavior 的相关功能需要先添加 “System.Windows.Interactivity” 库。可以通过 Nuget 进行安装。
如下图:
安装完成后如下图:
编写自己需要的 EffectBehavior 类
如下代码中,定义的 Behavior 类的为 EffectBehavior。EffectBehavior 需要继承自 Behavior<T>。
按 F12 进入 Behavior 的源码中可知,T (下面代码中为 FrameworkElement)为该行为需要产生作用的元素的类型,通过 AssociatedObject 进行关联。
代码如下:实现了鼠标悬停的时候,元素进行红色边框高亮显示。
using System.Windows; using System.Windows.Interactivity; using System.Windows.Media; using System.Windows.Media.Effects; namespace BehaviorDemo { // Behavior<T> T设置行为产生作用的元素类型 public class EffectBehavior : Behavior<FrameworkElement> { //使用 Behavior 必须重写以下两个虚方法 protected override void OnAttached() { base.OnAttached(); //AssociatedObject为关联对象, 是Behavior<T>中的T AssociatedObject.MouseMove += AssociatedObject_MouseMove; AssociatedObject.MouseLeave += AssociatedObject_MouseLeave; } private void AssociatedObject_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) { var element = sender as FrameworkElement; element.Effect = (Effect)new DropShadowEffect() { Color = Colors.Transparent, ShadowDepth = 0 }; } private void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { var element = sender as FrameworkElement; element.Effect = (Effect)new DropShadowEffect() { Color = Colors.Red, ShadowDepth = 0 }; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.MouseMove -= AssociatedObject_MouseMove; AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave; } } }
界面中引用 EffectBehavior
要在 XAML 代码中使用 Behavior,需要引入命名空间
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
具体代码如下:
<Window x:Class="BehaviorDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:BehaviorDemo" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" Title="MainWindow" Width="800" Height="450" mc:Ignorable="d"> <Grid> <StackPanel> <TextBox Width="100" Height="30" Margin="40"> <i:Interaction.Behaviors> <local:EffectBehavior /> </i:Interaction.Behaviors> </TextBox> <Button Width="100" Height="30" Margin="40"> <i:Interaction.Behaviors> <local:EffectBehavior /> </i:Interaction.Behaviors> </Button> </StackPanel> </Grid> </Window>
实现效果如下: