在WPF中经常有使用前台的触发器,常见的有Trigger,EventTrigger,DataTrigger,MultiTrigger等常用事件触发器,但是在WPF迁移至Avalonia平台时,由于avalonia前端界面写法与WPF有较大差异,给部分对avalonia还不太熟悉的人造成困扰。从个人经验角度,提供以下解决方案,仅供参考。
Trigger
属性触发器:在WPF中,Trigger
是基于控件属性值的条件触发器。而Avalonia推荐使用选择器(Selector)来实现类似功能,如":pointerover"伪类。
WPF写法:
<Ellipse>
<Ellipse.Style>
<Style TargetType="Ellipse" BasedOn="{StaticResource {x:Type Ellipse}}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" Value="Coral" />
</Trigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
avalonia写法:
<Ellipse>
<Ellipse.Styles>
<Style Selector="Ellipse:pointerover">
<Setter Property="Fill" Value="Coral" />
</Style>
</Ellipse.Styles>
</Ellipse>
EventTrigger
事件触发器(EventTrigger),在WPF中,EventTrigger用于响应事件(比如Loaded、Click),一般配合BeginStoryboard使用。
WPF写法:
<Ellipse Margin="0,10,0,0">
<Ellipse.Style>
<Style TargetType="Ellipse" BasedOn="{StaticResource {x:Type Ellipse}}">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="Coral" Duration="0:0:0.35" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="LightGreen" Duration="0:0:0.35" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
avalonia中的写法
<Ellipse>
<Ellipse.Styles>
<Style Selector="Ellipse:pointerover">
<Setter Property="Fill" Value="Coral" />
</Style>
</Ellipse.Styles>
参考CSS3的过渡(transitions)属性
<Ellipse.Transitions>
<Transitions>
<BrushTransition Property="Fill" Duration="0:0:0.35" />
</Transitions>
</Ellipse.Transitions>
</Ellipse>
DataTrigger
对于数据触发器(DataTrigger)在WPF中,DataTrigger
根据绑定的数据值进行触发。Avalonia中可以添加Avalonia.Xaml.Behaviors包引用,进一步设置触发式事件
WPF中的写法: 在当前这个实例中,使用了behaviors,对MouseUp事件绑定命令,该命令修改IsFlag属性,属性变化进而影响触发。
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
<Ellipse Margin="0,10,0,0">
<Ellipse.Style>
<Style TargetType="Ellipse" BasedOn="{StaticResource {x:Type Ellipse}}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsFlag}" Value="True">
<Setter Property="Fill" Value="Coral" />
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
<b:Interaction.Triggers>
<b:EventTrigger EventName="MouseUp">
<b:InvokeCommandAction Command="{Binding FlagCommand}" />
</b:EventTrigger>
</b:Interaction.Triggers>
</Ellipse>
在avalonia中写法
<Ellipse Classes.flag="{Binding Flag}">
<Ellipse.Styles>
<Style Selector="Ellipse.flag">
<Setter Property="Fill" Value="Coral" />
</Style>
</Ellipse.Styles>
<Interaction.Behaviors>
<EventTriggerBehavior EventName="PointerPressed">
<InvokeCommandAction Command="{Binding FlagCmd}" />
</EventTriggerBehavior>
</Interaction.Behaviors>
</Ellipse>
在avalonia后台写法
[ObservableProperty]
bool flag;
[RelayCommand]
public void FlagCmd()
{
Flag = !Flag;
}
MultiTrigger
在WPF中,MultiTrigger是多个条件组合的触发器。目前 Avalonia 不支持 MultiTrigger(没有原生组合条件),考虑用用Selector 的组合伪类。
<Button Content="Submit">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
<Condition Property="IsEnabled" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="Red"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
avalonia中的写法
<Button Content="Submit">
<Button.Styles>
<Style Selector="Button">
<Setter Property="Width" Value="200" />
<Setter Property="Height" Value="120" />
<Setter Property="Background" Value="LightGreen" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="BorderThickness" Value="0" />
</Style>
<Style Selector="Button[IsEnabled=True]:pointerover">
<Setter Property="Foreground" Value="Red" />
</Style>
</Button.Styles>
</Button>