Wpf Behaviors 库学习
in C# with 0 comment

什么是 Behaviors

在 WPF 开发中,我们经常需要为控件添加交互逻辑:

Behaviors(行为) 就是解决这个问题的利器!

Behaviors 是一种设计模式,用于将可复用的交互逻辑封装成独立组件,并以声明式方式附加到 UI 元素上。

安装 Behaviors SDK

WPF 官方推荐使用 Microsoft.Xaml.Behaviors.Wpf(原 Blend SDK 的现代化版本)。
安装 NuGet 包
Install-Package Microsoft.Xaml.Behaviors.Wpf
XAML 引入命名空间
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"

WPF 中 Behavior 与 Trigger 的区别

在 WPF 开发中,Microsoft.Xaml.Behaviors 库提供了两种强大的交互扩展机制:Behavior 和 Trigger。它们名字相似,都用于增强 UI 元素的交互能力,但设计目的、使用方式和适用场景完全不同。

本文将彻底讲清它们的区别,帮你做出正确选择。

核心概念对比

特性BehaviorTrigger
本质赋予控件一种“持续的能力”定义“当某条件满足时,执行某个动作”
类比给人“学会游泳”的技能给人一个“如果下雨,就打伞”的规则
生命周期从附加到控件开始,长期存在一次性响应,事件触发即执行
基类BehaviorTriggerBase
典型用途缩放、拖拽、输入限制、自动聚焦点击变色、播放动画、调用命令
简单记:
Behavior = 能力(技能)
Trigger = 条件-动作(规则)

基础使用

点击按钮改变背景色

<Button Content="点我变红">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <i:ChangePropertyAction 
                TargetObject="{Binding RelativeSource={RelativeSource AncestorType=Button}}"
                PropertyName="Background"
                Value="Red" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

常用内置 Action

Action作用
ChangePropertyAction修改属性值
InvokeCommandAction执行 ICommand(MVVM 必备)
CallMethodAction调用后台方法(不推荐,破坏 MVVM)

自定义 Behavior

基本结构

所有自定义 Behavior 都继承自 Behavior

public class MyCustomBehavior : Behavior<UIElement>
{
    protected DependencyObject AssociatedObject { get; } /* 被附加的元素 */
    protected override void OnAttached() { /* 订阅事件 */ }
    protected override void OnDetaching() { /* 取消订阅 */ }
}

完整示例:双击关闭窗口

// DoubleClickCloseBehavior.cs
public class DoubleClickCloseBehavior : Behavior<UIElement>
{
    protected override void OnAttached()
    {
        AssociatedObject.MouseDoubleClick += OnDoubleClick;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.MouseDoubleClick -= OnDoubleClick; // 防内存泄漏!
    }

    private void OnDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (Window.GetWindow(AssociatedObject) is Window w)
            w.Close();
    }
}

XAML 使用

<Grid>
    <i:Interaction.Behaviors>
        <local:DoubleClickCloseBehavior />
    </i:Interaction.Behaviors>
</Grid>

给 Behavior 传参

使用依赖属性就可以 不多赘述了

注意事项

忘记取消事件订阅 → 内存泄漏!
在 Behavior 中写业务逻辑 → 破坏 MVVM
用 CallMethodAction 调用后台方法 → 难以测试

后记

这是由阿里AI生成我审阅和修改的