【WPF学习笔记】WPF中行为(Behavior)的简单使用

  • A+
所属分类:.NET技术
摘要

在我之前的 WPF 开发中,需要实现一些页面效果时,常使用到的方式就是重写元素的样式(Style),然后再样式里面设置使用元素的各类触发器(Trigger)来实现效果。这样常常需要编写大量的代码。


WPF中行为(Behavior)的简单使用

在我之前的 WPF 开发中,需要实现一些页面效果时,常使用到的方式就是重写元素的样式(Style),然后再样式里面设置使用元素的各类触发器(Trigger)来实现效果。这样常常需要编写大量的代码。

近日学习到 WPF 中有一个叫做 Behavior 的扩展方式,可以用来实现页面效果,实现方式更为简便。学习笔记如下:

添加需要的DLL库

要使用 Behavior 的相关功能需要先添加 “System.Windows.Interactivity” 库。可以通过 Nuget 进行安装。

如下图:

【WPF学习笔记】WPF中行为(Behavior)的简单使用

安装完成后如下图:

【WPF学习笔记】WPF中行为(Behavior)的简单使用

编写自己需要的 EffectBehavior 类

如下代码中,定义的 Behavior 类的为 EffectBehavior。EffectBehavior 需要继承自 Behavior<T>。

按 F12 进入 Behavior 的源码中可知,T (下面代码中为 FrameworkElement)为该行为需要产生作用的元素的类型,通过 AssociatedObject 进行关联。

【WPF学习笔记】WPF中行为(Behavior)的简单使用

代码如下:实现了鼠标悬停的时候,元素进行红色边框高亮显示。

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>  

实现效果如下:

【WPF学习笔记】WPF中行为(Behavior)的简单使用