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 元素的交互能力,但设计目的、使用方式和适用场景完全不同。

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

核心概念对比

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

简单记:
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生成我审阅和修改的


Warning: Undefined array key "permalink" in /www/wwwroot/note.dc24.top/usr/themes/pinghsu/functions.php on line 313

Warning: Undefined array key "permalink" in /www/wwwroot/note.dc24.top/usr/themes/pinghsu/functions.php on line 333
回复