Avalonia如何使用行为(Behaviors) Avalonia Behaviors用法

来源:这里教程网 时间:2026-02-21 17:35:30 作者:

在Avalonia中使用Behaviors,核心是借助

Avalonia.Xaml.Behaviors
库,把UI事件(如点击、加载、焦点变化)与ViewModel中的命令解耦绑定,避免后台代码写逻辑,真正践行MVVM。

安装和引入命名空间

先通过NuGet安装最新稳定版:

Install-Package Avalonia.Xaml.Behaviors -Version 11.1.0.4

然后在XAML顶部声明两个关键命名空间:

xmlns:interactivity="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"

xmlns:behaviors="clr-namespace:Avalonia.Xaml.Behaviors;assembly=Avalonia.Xaml.Behaviors"

常用事件触发绑定

比如按钮点击执行命令:

<Button Content="保存">
  <interactivity:Interaction.Behaviors>
    <behaviors:EventTriggerBehavior EventName="Click">
      <behaviors:InvokeCommandAction Command="{Binding SaveCommand}" />
    </behaviors:EventTriggerBehavior>
  </interactivity:Interaction.Behaviors>
</Button>

支持的常见事件名包括:ClickLoadedUnloadedPointerPressedPointerReleasedLostFocus等。

多个事件可并列写在同一控件内,例如同时监听按下和松开:

<pointerpressedeventtrigger> → DownCommand</pointerpressedeventtrigger>
<pointerreleasedeventtrigger> → UpCommand</pointerreleasedeventtrigger>

页面或控件加载时自动执行

适合初始化数据、设置状态等场景:

<Grid>
  <interactivity:Interaction.Behaviors>
    <behaviors:LoadedTrigger>
      <behaviors:InvokeCommandAction Command="{Binding LoadCommand}" />
    </behaviors:LoadedTrigger>
  </interactivity:Interaction.Behaviors>
</Grid>

注意:

LoadedTrigger
是专用行为,比用
EventTriggerBehavior EventName="Loaded"
更语义清晰,也更可靠(尤其对动态内容)。

自定义行为(进阶但实用)

当内置行为不够用时,可继承

Behavior<t></t>
写轻量逻辑。例如让 TextBox 在
IsVisible=true
时自动聚焦并全选:

public class FocusOnVisibleBehavior : Behavior<TextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject?.PropertyChanged += OnPropertyChanged;
    }
<pre class='brush:php;toolbar:false;'>private void OnPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
{
    if (e.Property == Visual.IsVisibleProperty && AssociatedObject?.IsVisible == true)
    {
        AssociatedObject.Focus();
        AssociatedObject.SelectAll();
    }
}
protected override void OnDetaching() => 
    AssociatedObject?.PropertyChanged -= OnPropertyChanged;

}

XAML中直接引用:

<TextBox local:FocusOnVisibleBehavior.Attached="True" />

不复杂但容易忽略:行为只在控件生命周期内有效,确保 ViewModel 中的命令是

ICommand
类型(推荐用
[RelayCommand]
),且未被GC提前回收。

相关推荐