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

网站怎么才能被搜到微网站排版

网站怎么才能被搜到,微网站排版,公司做网站百度还是阿里,洛阳网络推广从 WPF 到 Avalonia 的迁移系列实战篇4:控件模板与 TemplatedControl 我的GitHub仓库Avalonia学习项目包含完整的Avalonia实践案例与代码对比。 我的gitcode仓库是Avalonia学习项目 在前几篇中,我们聊过了依赖属性、路由事件、资源等迁移相关的基础&…

从 WPF 到 Avalonia 的迁移系列实战篇4:控件模板与 TemplatedControl

我的GitHub仓库Avalonia学习项目包含完整的Avalonia实践案例与代码对比。
我的gitcode仓库是Avalonia学习项目

在前几篇中,我们聊过了依赖属性、路由事件、资源等迁移相关的基础,这一篇我们进入 自定义控件开发
如果你在 WPF 中做过复杂控件,就一定绕不开 Control + ControlTemplate 的组合。

那么问题来了:

Avalonia 中,我们该如何实现类似的机制?

答案就是 —— TemplatedControl

为了直观演示,我写了一个小 Demo:自定义一个 三角形控件(TriangleControl),让它自动闪烁。我们分别用 WPFAvalonia 来实现,最后对比一下两者的异同。


一、为什么要用 TemplatedControl?

在 UI 框架里,我们有两种常见的自定义控件方式:

  1. UserControl

    • 逻辑 + UI 写在一起
    • 简单场景够用,但换皮肤、换模板比较困难
  2. TemplatedControl(WPF 中就是 Control)

    • 逻辑(C#)和外观(XAML 模板)解耦
    • 控件类只负责属性和逻辑,不关心 UI 长什么样
    • 外观完全交给 ControlTemplate 控制

例如 WPF 的 Button,内部逻辑并不知道它有边框还是圆角,这些都由 ControlTemplate 决定。
Avalonia 完全继承了这一思想,只不过对应的基类换成了 TemplatedControl


二、WPF 版 TriangleControl

在 WPF 中,我们继承 Control,通过 OnApplyTemplate() 获取模板里的元素,然后对它做动画。

控件类

public class TriangleControl : Control
{private Path? _path;static TriangleControl(){DefaultStyleKeyProperty.OverrideMetadata(typeof(TriangleControl),new FrameworkPropertyMetadata(typeof(TriangleControl)));}public static readonly DependencyProperty FillProperty =DependencyProperty.Register(nameof(Fill), typeof(Brush),typeof(TriangleControl), new PropertyMetadata(Brushes.Black));public Brush Fill{get => (Brush)GetValue(FillProperty);set => SetValue(FillProperty, value);}public override void OnApplyTemplate(){base.OnApplyTemplate();if (_path != null){// 避免重复应用模板导致多次动画_path.ClearValue(UIElement.OpacityProperty);}_path = GetTemplateChild("PART_Path") as Path;if (_path != null){var blinkAnimation = new DoubleAnimation{From = 1.0,To = 0.2,Duration = TimeSpan.FromSeconds(0.5),AutoReverse = true,RepeatBehavior = RepeatBehavior.Forever};_path.BeginAnimation(UIElement.OpacityProperty, blinkAnimation);}}
}

样式模板

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:controls="clr-namespace:WpfDemo.controls"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Style TargetType="{x:Type controls:TriangleControl}"><Setter Property="Width" Value="50" /><Setter Property="Height" Value="50" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:TriangleControl}"><Viewbox Stretch="Fill"><PathData="M 0,1 L 0.5,0 L 1,1 Z"Fill="{TemplateBinding Fill}"Stretch="Uniform"x:Name="PART_Path" /></Viewbox></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>

效果:一个三角形控件,透明度循环闪烁。


三、Avalonia 版 TriangleControl

在 Avalonia 中,流程几乎一模一样:

  • 继承 TemplatedControl
  • 属性用 StyledProperty<T>
  • 模板元素通过 e.NameScope.Find<T>() 获取
  • 动画系统换成 Animation + KeyFrame

控件类

public class TriangleControl : TemplatedControl
{private Path? _path;public static readonly StyledProperty<IBrush> FillProperty =AvaloniaProperty.Register<TriangleControl, IBrush>(nameof(Fill), Brushes.Black);public IBrush Fill{get => GetValue(FillProperty);set => SetValue(FillProperty, value);}protected override void OnApplyTemplate(TemplateAppliedEventArgs e){base.OnApplyTemplate(e);_path = e.NameScope.Find<Path>("PART_Path");if (_path != null){var animation = new Animation{Duration = TimeSpan.FromSeconds(1),IterationCount = IterationCount.Infinite,Easing = new SineEaseInOut(),Children ={new KeyFrame{Cue = new Cue(0),Setters = { new Setter(Visual.OpacityProperty, 1.0) }},new KeyFrame{Cue = new Cue(0.5),Setters = { new Setter(Visual.OpacityProperty, 0.2) }},new KeyFrame{Cue = new Cue(1),Setters = { new Setter(Visual.OpacityProperty, 1.0) }}}};animation.RunAsync(_path, CancellationToken.None);}}
}

样式模板

<Stylesxmlns="https://github.com/avaloniaui"xmlns:controls="clr-namespace:AvaloniaDemo.Controls"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Design.PreviewWith><controls:TriangleControl /></Design.PreviewWith><Style Selector="controls|TriangleControl"><Setter Property="Width" Value="50" /><Setter Property="Height" Value="50" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="controls:TriangleControl"><Viewbox Stretch="Uniform"><PathData="M 0,1 L 0.5,0 L 1,1 Z"Fill="{TemplateBinding Fill}"Stretch="Uniform"x:Name="PART_Path" /></Viewbox></ControlTemplate></Setter.Value></Setter></Style>
</Styles>

效果:与 WPF 一致,三角形控件透明度闪烁。


四、WPF vs Avalonia 对比分析

下面是一个详细对比表格:

功能点WPFAvalonia
基类ControlTemplatedControl
依赖属性DependencyPropertyStyledProperty<T>
应用模板方法OnApplyTemplate()OnApplyTemplate(TemplateAppliedEventArgs)
查找模板元素GetTemplateChild("PART_X")e.NameScope.Find<T>("PART_X")
模板绑定{TemplateBinding ...}{TemplateBinding ...}(完全一致)
动画系统Storyboard / DoubleAnimationAnimation / KeyFrame

可以看到:

  • 整体思想几乎完全一致,因此从 WPF 迁移过来没有学习门槛
  • Avalonia 在语法上更简洁,比如属性直接用 StyledProperty,不需要 DependencyProperty.Register 那么啰嗦
  • 动画系统的 API 不同,但用法也很直观

五、心得体会

通过这个 Demo,我们发现:

  • WPF 和 Avalonia 在自定义控件的核心思路上保持了高度一致性

  • 只要你熟悉 WPF 的 ControlTemplate 模型,迁移到 Avalonia 基本无缝

  • 不同点主要体现在:

    1. API 命名(DependencyPropertyStyledProperty
    2. 模板元素查找方式
    3. 动画系统

因此,掌握 TemplatedControl = 掌握 Avalonia 自定义控件的核心

✍️ 结语
如果你正打算从 WPF 迁移到 Avalonia,不妨从这种简单的自定义控件开始练手。理解了 TemplatedControl,你就掌握了 Avalonia 的控件扩展基础。

我的GitHub仓库Avalonia学习项目包含完整的Avalonia实践案例与代码对比。
我的gitcode仓库是Avalonia学习项目

http://www.dtcms.com/a/436088.html

相关文章:

  • 建设银行积分网站宿迁网站推广公司
  • 企业电子商务网站的建设方式logo设计公司标志
  • [论文阅读] AI+SRE(网站可靠性工程) | 字节跳动ErrorPrism:微服务错误追踪准确率97%!告别日志“一团乱麻”
  • 打开无忧管理后台网站网站建设 中企动力 常州
  • 装饰公司网站模板17网一起做网店网站
  • 怎么做自己的发卡网站6打开百度地图导航
  • html网页结构文件厦门关键词排名seo
  • 网站建设 嘉兴网站建设 方案书
  • 淄博网站文章优化php网站开发开发实例教程
  • 项目中HTTP协议处理部分(续)
  • 南京网站开发南京乐识不错wordpress文章阅读数
  • 宠物网站设计说明书上海建设网站公司
  • 网站建设具体要求吴江区经济开发区建设工程网站
  • wordpress建外贸网站网站建设专员 岗位职责
  • pc网站同步手机网站千度搜索引擎
  • AI 算力加速指南(中端篇):RTX 3060/i7-12 代 / 16G 内存的多任务优化实战,从卡顿到并行(一)
  • Ymodem协议详解
  • 制作简易网站用织梦做网站有钱途吗
  • 高效无风扇1000W AC-DC电源系统设计:基于开关耦合电感与ZVS技术的实现
  • Spring Boot 集成 JavaMail 发送邮件
  • 返利网 网站开发制作网站赚钱吗
  • [实战] 实时任务 vs 非实时任务:在PREEMPT-RT环境下的编程实践
  • RabbitMq入门之概括
  • 山西营销网站建设那个公司好上海百度seo
  • 经验分享:如何通过SAP HANA数据库优化将SAP B1性能提升50%
  • 免费注册域名邮箱龙岗优化网站建设
  • 如何通过cpa网站做推广产品展厅柜设计公司
  • 机器视觉滤光片怎么选?
  • 韶关市建设与房地产信息网站营销排名seo
  • 波音网站开发php网站开发用什么ide