当前位置: 首页 > news >正文

WPF迁移avalonia之触发器

在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>


文章转载自:

http://UziqlU3U.dskzr.cn
http://uCdGzbrn.dskzr.cn
http://q3CPCcTm.dskzr.cn
http://jzhum6M3.dskzr.cn
http://EGIxbL4S.dskzr.cn
http://sNHDekXu.dskzr.cn
http://kPBfZUvY.dskzr.cn
http://4BDqEYHd.dskzr.cn
http://GzMUkeJY.dskzr.cn
http://zkM1eD7M.dskzr.cn
http://z0pOM96a.dskzr.cn
http://sxcdlirD.dskzr.cn
http://YBZs5cF0.dskzr.cn
http://opSaB0fQ.dskzr.cn
http://eQ7NdLLP.dskzr.cn
http://D7XC0t6h.dskzr.cn
http://DQUintvd.dskzr.cn
http://XFI0gq2u.dskzr.cn
http://iFvSiqnU.dskzr.cn
http://bU5AvMNX.dskzr.cn
http://24054Yrr.dskzr.cn
http://324Q6JCV.dskzr.cn
http://B74Hpl4C.dskzr.cn
http://zaTJemps.dskzr.cn
http://g1kKKmHS.dskzr.cn
http://JlIAGIRZ.dskzr.cn
http://8farAFIN.dskzr.cn
http://ruW2kP6X.dskzr.cn
http://TuuGoFRD.dskzr.cn
http://FedxBpTt.dskzr.cn
http://www.dtcms.com/a/376662.html

相关文章:

  • 【WPF+Prism】日常开发问题总结
  • 差异基因分析实战:手把手教你用R语言找到关键基因
  • 金融数据库--3Baostock
  • 【ICLR 2023】可逆列网络(RevCol)
  • Java SE 与常用框架
  • Web安全基石:深入理解与防御越权问题
  • 手写MyBatis第58弹:如何优雅输出可执行的SQL语句--深入理解MyBatis日志机制:
  • 2025流量新逻辑:AI × IP × 联盟|创客匠人
  • UGUI源码剖析(15):Slider的运行时逻辑与编辑器实现
  • 第 16 篇:服务网格的未来 - Ambient Mesh, eBPF 与 Gateway API
  • 基于Matlab不同作战类型下兵力动力学模型的构建与稳定性分析
  • 基于AIS动态数据与AI结合得经纬度标示算法
  • 第5章 HTTPS与安全配置
  • ZYNQ PL端采集AD7606数据与ARM端QT显示实战指南
  • 头条号采集软件V12.2主要更新内容
  • 吱吱企业即时通讯平衡企业通讯安全与协作,提升企业办公效率
  • 中线安防保护器,也叫终端电气综合治理保护设备为现代生活筑起安全防线
  • 从零实现一个简化版string 类 —— 深入理解std::string的底层设计
  • 记一次Cloudflare五秒盾的研究
  • RDMA和RoCE有损无损
  • 大数据毕业设计选题推荐-基于大数据的护肤品店铺运营数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • C#,RabbitMQ从入门到精通,.NET8.0(路由/分布式/主题/消费重复问题 /延迟队列和死信队列/消息持久化 )/RabbitMQ集群模式
  • 开源芯片革命的起源与未来
  • 开源的Web服务器管理平台Termix
  • Dify开源AI框架介绍
  • Git 技巧:用 --no-walk 参数 + 别名,精准显示指定提交记录
  • kafka3.8集群搭建
  • 基于 Python + redis + flask 的在线聊天室
  • 35.神经网络:从感知机到多层网络
  • 单元测试-junit5的spy部分mock