C# Avalonia 18- ControlTemplates - FlipPanelTest

news/2025/11/22 16:26:08/文章来源:https://www.cnblogs.com/dalgleish/p/19257079

FlipPanel2类是负责控制逻辑。

FlipPanel2.cs

using Avalonia;
using Avalonia.Animation.Easings;
using Avalonia.Controls;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using System;namespace AvaloniaUI
{[TemplatePart("PART_FrontHost", typeof(Border))][TemplatePart("PART_BackHost", typeof(Border))][TemplatePart("PART_FlipButton", typeof(ToggleButton))]public class FlipPanel2 : TemplatedControl{// ========== 依赖属性 ==========public static readonly StyledProperty<Control?> FrontContentProperty =AvaloniaProperty.Register<FlipPanel2, Control?>(nameof(FrontContent));public static readonly StyledProperty<Control?> BackContentProperty =AvaloniaProperty.Register<FlipPanel2, Control?>(nameof(BackContent));public static readonly StyledProperty<bool> IsFlippedProperty =AvaloniaProperty.Register<FlipPanel2, bool>(nameof(IsFlipped));public static readonly StyledProperty<double> FlipAngleProperty =AvaloniaProperty.Register<FlipPanel2, double>(nameof(FlipAngle), 0d);// ========== CLR 包装 ==========public Control? FrontContent{get => GetValue(FrontContentProperty);set => SetValue(FrontContentProperty, value);}public Control? BackContent{get => GetValue(BackContentProperty);set => SetValue(BackContentProperty, value);}public bool IsFlipped{get => GetValue(IsFlippedProperty);set => SetValue(IsFlippedProperty, value);}public double FlipAngle{get => GetValue(FlipAngleProperty);set => SetValue(FlipAngleProperty, value);}// ========== 模板部件 ==========private ToggleButton? flipButton;public FlipPanel2(){// 监听属性变化this.GetObservable(IsFlippedProperty).Subscribe(_ =>{UpdatePseudoClasses();});}protected override void OnApplyTemplate(TemplateAppliedEventArgs e){base.OnApplyTemplate(e);flipButton = e.NameScope.Find<ToggleButton>("PART_FlipButton");if (flipButton != null)flipButton.Click += (_, _) => ToggleFlipped();UpdatePseudoClasses();}private void ToggleFlipped(){IsFlipped = !IsFlipped;}private void UpdatePseudoClasses(){PseudoClasses.Set(":flipped", IsFlipped);}}
}

测试的Style.axaml

<Styles xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:AvaloniaUI"><Design.PreviewWith></Design.PreviewWith><Style Selector="local|FlipPanel2"><!-- 默认角度 --><Setter Property="local:FlipPanel2.FlipAngle" Value="0"/><Setter Property="Template"><Setter.Value><ControlTemplate><Grid RowDefinitions="*, auto"><!-- Front content --><Border x:Name="PART_FrontHost"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}"CornerRadius="{TemplateBinding CornerRadius}"Background="#E0F7FA"Opacity="1"><ContentPresenter Content="{TemplateBinding FrontContent}"HorizontalAlignment="Center"VerticalAlignment="Center"/><Border.Transitions><Transitions><DoubleTransition Property="Opacity"Duration="0:0:0.3"Easing="SineEaseInOut"/></Transitions></Border.Transitions></Border><!-- Back content --><Border x:Name="PART_BackHost"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}"CornerRadius="{TemplateBinding CornerRadius}"Background="#FFF3E0"Opacity="0"><ContentPresenter Content="{TemplateBinding BackContent}"HorizontalAlignment="Center"VerticalAlignment="Center"/><Border.Transitions><Transitions><DoubleTransition Property="Opacity"Duration="0:0:0.3"Easing="SineEaseInOut"/></Transitions></Border.Transitions></Border><!-- Flip button --><ToggleButton x:Name="PART_FlipButton"Grid.Row="1"Width="20" Height="20"Margin="0,5,0,5"HorizontalAlignment="Center"VerticalAlignment="Center"><ToggleButton.Template><ControlTemplate><Grid><Ellipse Stroke="#555" Fill="WhiteSmoke" StrokeThickness="0.5"/><Path Data="M4,5 L7,6.5 L4,8 Z" Margin="2,0,0,0"Fill="#455A64"Height="15"Stretch="Uniform"HorizontalAlignment="Center"VerticalAlignment="Center"/></Grid></ControlTemplate></ToggleButton.Template><ToggleButton.RenderTransform><Rotate3DTransform AngleY="{Binding FlipAngle, RelativeSource={RelativeSource TemplatedParent}}"><Rotate3DTransform.Transitions><Transitions><DoubleTransition Property="AngleY"Duration="0:0:0.3"Easing="SineEaseInOut"/></Transitions></Rotate3DTransform.Transitions></Rotate3DTransform></ToggleButton.RenderTransform></ToggleButton></Grid></ControlTemplate></Setter.Value></Setter><!-- flipped 状态样式 --><Style Selector="^:flipped /template/ Border#PART_FrontHost"><Setter Property="Opacity" Value="0"/><Setter Property="IsHitTestVisible" Value="False"/></Style><Style Selector="^:flipped /template/ Border#PART_BackHost"><Setter Property="Opacity" Value="1"/><Setter Property="IsHitTestVisible" Value="True"/></Style><Style Selector="^:not(:flipped) /template/ Border#PART_FrontHost"><Setter Property="IsHitTestVisible" Value="True"/></Style><Style Selector="^:not(:flipped) /template/ Border#PART_BackHost"><Setter Property="IsHitTestVisible" Value="False"/></Style><!-- 旋转角度 --><Style Selector="^:flipped"x:SetterTargetType="local:FlipPanel2"><Setter Property="local:FlipPanel2.FlipAngle" Value="180"/></Style></Style>
</Styles>

FlipPanelTest.axaml代码

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="using:AvaloniaUI"Height="300" Width="300"x:Class="AvaloniaUI.FlipPanelTest"Title="FlipPanelTest"><Grid Background="Transparent"><local:FlipPanel2 x:Name="panel"BorderBrush="DarkOrange"BorderThickness="3"IsFlipped="True"CornerRadius="4"Margin="10"><!-- Front content --><local:FlipPanel2.FrontContent><StackPanel Margin="6"><StackPanel.Styles><Style Selector="Button"><Setter Property="HorizontalAlignment" Value="Center"/><Setter Property="Padding" Value="3"/><Setter Property="Margin" Value="3"/></Style></StackPanel.Styles><TextBlock Text="This is the front side of the FlipPanel."TextWrapping="Wrap"Margin="3"FontSize="16"Foreground="DarkOrange"/><Button Content="Button One"/><Button Content="Button Two"/><Button Content="Button Three"/><Button Content="Button Four"/></StackPanel></local:FlipPanel2.FrontContent><!-- Back content --><local:FlipPanel2.BackContent><Grid Margin="6" RowDefinitions="auto,*"><TextBlock Text="This is the back side of the FlipPanel."TextWrapping="Wrap"Margin="3"FontSize="16"Foreground="DarkMagenta"/><Button Grid.Row="1"Margin="3"Padding="10"Content="Flip Back to Front"HorizontalAlignment="Center"VerticalAlignment="Center"Click="cmdFlip_Click"/></Grid></local:FlipPanel2.BackContent></local:FlipPanel2></Grid>
</Window>

FlipPanelTest.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Shares.Avalonia;namespace AvaloniaUI;public partial class FlipPanelTest : Window
{public FlipPanelTest(){InitializeComponent();this.Load("avares://AvaloniaUI/Demos/Book/18/CustomControls/FlipPanel.axaml");}private void cmdFlip_Click(object? sender, RoutedEventArgs e){// 切换翻转状态panel.IsFlipped = !panel.IsFlipped;}
}

运行效果

image

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 最新仿石漆厂家权威推荐榜:真石漆 / 绿色环保仿石漆优质品牌精选仿石漆/真石漆/绿色真石漆/有资质的仿石漆公司推荐

引言 随着建筑装饰对质感与环保的双重追求,仿石漆已成为外墙装饰的主流选择,但市场品牌混杂、品质良莠不齐的问题仍困扰采购者。本次榜单基于国际涂料协会(IFPA)测评标准,结合 3000 小时耐候性测试、环保指标检测…

2025年纱线烘干机制造厂权威推荐榜单:气流烘干机/筒子烘干机/快速烘干机源头制造厂精选

在纺织产业升级和技术进步的推动下,纱线烘干机以其高效节能和稳定可靠的性能特点,正成为纺织企业提升产品质量和生产效率的关键设备。 根据纺织机械行业数据统计,2024年中国纺织烘干设备市场规模达到68亿元,年均增…

CTF逆向Re:零基础系统性入门教程-5-动态调试

目录 动态调试是什么 先说一些基础概念 为什么要动态调试 怎么动态调试 1.动态调试代替思考 2.动态调试劫持控制动态调试是什么 简单说,就是运行程序,运行中监控程序的运行流程,数据变化,和静态分析的对比如下场景…

CF1817B Fish Graph

题目大意 定义了一个鱼图,求是否存在并输出环和两点的边。 题意分析 直接暴力,但是需要加一点点小优化,具体如下:环的检测:我们首先需要在图中找到一个环,如果遇到了一个已经访问过的节点,并且该节点不是当前路…

CF1630C Paint the Middle

最简题意 给定一个长度为 \(n\) 的数组,数组中的元素初始值都为零。可以通过以下操作来修改颜色:选择三个元素 \((i,j,k)\) 满足 \(1\leq i<j<k \leq n\),并且保证 \(a_i=a_k\),同时 \(c_i=c_k=0\),那么可以…

CF1707B Difference Array

题目大意 题目大意非常简短,就是给你一个数组。每次同时进行 \(a_i=a_{i+1}-a_i\) 的操作,求最后留下的一个数是什么,如下:计算数组中相邻两个元素的差值,得到新的数组。 对新数组排序,然后将其替换。 重复此过程…

P3113 [USACO14DEC] Marathon G

题目大意 马拉松路线由 \(N\) 个检查点组成,选手必须按顺序经过每个检查点。有两种操作:更新某个检查点的坐标。 查询从检查点 \(X\) 到 \(Y\) 的最短路径长度,允许跳过其中一个中间。要求高效处理这些操作。 思路分…

封装map和set(红黑树作为底层结构如何完成map和set插入遍历)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

淮安市一对一辅导机构权威排行榜推荐:2026家教机构穿透式测评!

为贴合淮安市小学、初中、高中学生对语文、数学、英语、理化生、史地政全部学科一对一家教课外补习的核心需求,解决家长选择辅导培训教育机构的核心困扰——教师资质虚实难辨、教学方案千篇一律、隐形消费层出不穷、孩…

崖山数据库导出 - 华

崖山数据库导出将F:\A_MAZ\A_package\yashandb-client-23.4.1.102-windows-amd64\binF:\A_MAZ\A_package\yashandb-client-23.4.1.102-windows-amd64\lib放入环境变量 然后在F:\A_MAZ\A_package\yashandb-client-23.4.…

南昌航空大学-软件学院-23207201-吕玉英

题目集 1-3电梯调度程序实践与反思 一、前言 过去这些天里,我们开始了为期三周的电梯调度大作业学习,这三次题目集围绕电梯调度系统展开渐进式设计,体现了从基础到复杂、从单一功能到系统架构的完整学习路径。第一次…

AI Compass前沿速览:Nano Banana Pro、Gemini 3 、 HunyuanVideo 1.5 、Meta SAM 3D生成

AI Compass前沿速览:Nano Banana Pro、Gemini 3 、 HunyuanVideo 1.5 、Meta SAM 3D生成AI Compass前沿速览:Nano Banana Pro、Gemini 3 、 HunyuanVideo 1.5 、Meta SAM 3D生成 AI-Compass 致力于构建最全面、最实用…

Prufer序列与Cayley公式

Cayley公式:n个节点的带标号的无根树有n^(n-2)个。 证明 Prufer序列与树的转换 重要性质: prufer序列中某个编号出现的次数+1就等于这个编号的节点在无根树中的度数。

MX Round 27 解题报告

MX Round 27 解题报告 T1 观察一:对于区间 \([l,l]\),它如果不为 \(1\),那么有 \(a_i=w_{l,l}\);否则有 \(a_i=0\) 或 \(a_i=1\)。 观察二:对于第 \(i\) 个和第 \(i+1\) 个无法被确定的数,通过查询区间内已知的最…

11.22模拟赛

T1 给定一棵 \(n\) 个点的树,点有颜色,问有哪些 \(u\) 满足,对于任意的 \(v\),路径 \((u,v)\) 上不出现重复颜色。 对于所有数据,满足 \(1 \leq n \leq 2 \times 10^5, 1 \leq c_i \leq n\)。 题解 考虑用样的颜色…

从超时到秒杀:三路快排解决数组排序的完整实战与反思

从超时到秒杀:三路快排解决数组排序的完整实战与反思在算法学习中,“数组排序”是绕不开的基础问题,但看似简单的需求,却藏着对时间复杂度、空间复杂度的深度考量。本文结合我在 LeetCode “数组升序排列” 问题中…

2025年光伏安装厂家权威推荐榜单:光伏施工/光伏/光伏发电源头厂家精选

在能源转型战略的推动下,光伏产业迎来爆发式增长,专业的光伏安装服务正成为保障系统高效稳定运行的关键环节。 根据行业统计数据,2024年中国光伏新增装机量达277.57GW,同比增长28.3%,相当于2010年到2020年11年的累…

机房夸夸乐

前言 先开坑…… 咱们来写一个机房夸夸乐吧,争取 \(noip\) 前更完。 可能会有一些外号,自己猜猜是谁吧~~ 注:按照座位顺序来的。

2025年镀锌水沟盖板订做厂家权威推荐榜单:雨水沟盖板/污水沟盖板/镀锌排水沟盖板源头厂家精选

在城市化建设和工业基础设施升级的推动下,镀锌水沟盖板凭借其优异的防腐性能和承载能力,正成为市政工程、工业园区和道路排水系统的关键部件。 根据市场调研数据显示,2024年中国钢格板市场规模达到85亿元,年均增长…

完整教程:【Deepseek OCR】重磅测试,mac环境下的体验【本人已经本地实验成功】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …