行为是一类事物的共同特征,在WPF中通过行为可以封装一些通用的界面功能,从而实现代码重用来提高开发效率。因此他是一个非常好用的工具。行为将事件和处理方法封装到一起,简化ui界面xaml代码的复杂性和复用性。
通常情况下不用自己写行为, 直接使用Behaviors包中的行为就行了。也可以自定义行为。
1.使用Nuget包:
Microsoft.Xaml.Behaviors.Wpf
System.Windows.Interactivity.WPF
2.引用命名空间
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
3.下面只是介绍其应用例子,不做讲解
(1)行为(Behaviors)
- Button按钮点击清除TextBox文本
public class ClearTextBehavior : Behavior<Button>
{
public TextBox Target
{
get { return (TextBox)GetValue(TargetProperty); }
set { SetValue(TargetProperty, value); }
}
public static readonly DependencyProperty TargetProperty =
DependencyProperty.Register(nameof(Target), typeof(TextBox), typeof(ClearTextBehavior), new PropertyMetadata(null));
protected override void OnAttached()
{
AssociatedObject.Click += OnClick;
}
protected override void OnDetaching()
{
AssociatedObject.Click -= OnClick;
}
private void OnClick(object sender, RoutedEventArgs e)
{
Target?.Clear();
}
}
- xaml使用
<Button HorizontalAlignment="Left" Content="Clear">
<i:Interaction.Behaviors>
<local:ClearTextBehavior Target="{Binding ElementName=textBox}" />
</i:Interaction.Behaviors>
</Button>
(2)触发器(Trigggers)
行为触发器,通常是结合Action使用,InvokeCommandAction、CallMethodAction、ChangePropertyAction
- InvokeCommandAction
//View层代码
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ChangeTextBoxAsync}" />
</i:EventTrigger>
</i:Interaction.Triggers>
//VM层代码
public RelayCommand ChangeTextBoxAsync
{
get
{
return new RelayCommand(async () =>
{
});
}
}
- CallMethodAction,关闭窗口
<Button Content="Close">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="Close" TargetObject="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
- ChangePropertyAction,点击按钮背景色变红色
<Button Content="ChangeProperty">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:ChangePropertyAction
PropertyName="Background"
TargetObject="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"
Value="red" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>