WPF之可翻转面板

1,创建翻转面板的资源字典:FlippPanel.xaml。

  • 无外观控件同样必须给样式指定类型( <ControlTemplate TargetType="ss:FlipPanel">),相关详情参考:WPF之创建无外观控件-CSDN博客)。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:ss="clr-namespace:无外观控件"
                    xmlns:local="clr-namespace:无外观控件.Themes">
    <Style TargetType="ss:FlipPanel">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ss:FlipPanel">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="auto"></RowDefinition>
                            <RowDefinition Height="auto"></RowDefinition>
                        </Grid.RowDefinitions>
                        <!--1,为给模板添加VisualStateManager元素,模板必须使用布局面板。布局面板包含控件的两个可视化对象和VisualStateManager元素(该元素不可见)-->
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup Name="ViewStates">
                                <VisualStateGroup.Transitions>
                                    <!--两个可视对象切换时间,以及伴随的ToggleButton切换动画-->
                                    <VisualTransition To="Normal" GeneratedDuration="00:00:01">
                                        <Storyboard >
                                            <DoubleAnimation  To="0" Storyboard.TargetName="PART_Rota" Storyboard.TargetProperty="Angle" ></DoubleAnimation>
                                        </Storyboard>
                                    </VisualTransition>
                                    <VisualTransition To="Flipped" GeneratedDuration="00:00:2">
                                        <Storyboard >
                                            <DoubleAnimation  To="180" Storyboard.TargetName="PART_Rota" Storyboard.TargetProperty="Angle" ></DoubleAnimation>
                                        </Storyboard>
                                    </VisualTransition>
                                </VisualStateGroup.Transitions>
                                <VisualState Name="Normal">
                                    <Storyboard >
                                        <DoubleAnimation To="0" Storyboard.TargetName="front" Storyboard.TargetProperty="Opacity" Duration="00:00:00"></DoubleAnimation>
                                        <!--ToggleButton旋转动画不能省,否则动画异常-->
                                        <DoubleAnimation  To="0"  Storyboard.TargetName="PART_Rota" Storyboard.TargetProperty="Angle"></DoubleAnimation>
                                    </Storyboard>
                                </VisualState>
                                <VisualState Name="Flipped">
                                    <Storyboard >
                                        <DoubleAnimation To="0" Storyboard.TargetName="back" Storyboard.TargetProperty="Opacity" Duration="00:00:00"></DoubleAnimation>
                                        <!--ToggleButton旋转动画不能省,否则动画异常-->
                                        <DoubleAnimation  To="180" Storyboard.TargetName="PART_Rota" Storyboard.TargetProperty="Angle" Duration="00:00:00" ></DoubleAnimation>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border  x:Name="front" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="{TemplateBinding CornerRadius}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                            <ContentPresenter Content="{TemplateBinding FrontContent}"></ContentPresenter>
                        </Border>
                        <Border x:Name="back" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="{TemplateBinding CornerRadius}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                            <ContentPresenter Content="{TemplateBinding BackContent}"></ContentPresenter>
                        </Border>
                        <ToggleButton  Grid.Row="1" Height="40" Name="FlipButton" RenderTransformOrigin="0.5,0.5">
                            <ToggleButton.RenderTransform>
                                <RotateTransform x:Name="PART_Rota" ></RotateTransform>
                            </ToggleButton.RenderTransform>
                            <ToggleButton.Template>
                                <ControlTemplate TargetType="ToggleButton">
                                    <ToggleButton Grid.Column="1" Grid.Row="1"  Name="FlipButton">
                                        <ToggleButton.Template>
                                            <ControlTemplate TargetType="ToggleButton">
                                                <Rectangle >
                                                    <Rectangle.Fill>
                                                        <DrawingBrush Stretch="None">
                                                            <DrawingBrush.Drawing>
                                                                <GeometryDrawing Brush="White">
                                                                    <GeometryDrawing.Pen>
                                                                        <Pen Brush="Black" Thickness="2"></Pen>
                                                                    </GeometryDrawing.Pen>
                                                                    <GeometryDrawing.Geometry>
                                                                        <GeometryGroup>
                                                                            <EllipseGeometry RadiusX="15" RadiusY="15"></EllipseGeometry>
                                                                            <CombinedGeometry GeometryCombineMode="Intersect">
                                                                                <CombinedGeometry.Geometry1>
                                                                                    <EllipseGeometry RadiusX="7.5" RadiusY="7.5"></EllipseGeometry>
                                                                                </CombinedGeometry.Geometry1>
                                                                                <CombinedGeometry.Geometry2>
                                                                                    <PathGeometry   Figures="M-7.5,0 L0,-7.5 L7.5,-7.5 L0,0 L7.5,7.5 L0,7.5 Z">
                                                                                    </PathGeometry>
                                                                                </CombinedGeometry.Geometry2>
                                                                            </CombinedGeometry>
                                                                        </GeometryGroup>
                                                                    </GeometryDrawing.Geometry>
                                                                </GeometryDrawing>
                                                            </DrawingBrush.Drawing>
                                                        </DrawingBrush>
                                                    </Rectangle.Fill>
                                                </Rectangle>
                                            </ControlTemplate>
                                        </ToggleButton.Template>
                                    </ToggleButton>
                                </ControlTemplate>
                            </ToggleButton.Template>
                        </ToggleButton>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
  • VisualStateManager只能在布局面板下进行状态管理。

2,在generic.xaml中添加资源字典FlipPanel.xaml.

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="无外观控件;component/Themes/colorpicker.xaml">
        </ResourceDictionary>
        <ResourceDictionary Source="无外观控件;component/Themes/FlipPanel.xaml"></ResourceDictionary>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

3,编写代码

 [TemplatePart(Name = "FlipButton", Type =typeof(ToggleButton))]//该特性只是进行提示,无其他意义,可舍去
    [TemplateVisualState(GroupName = "Normal", Name = "ViewStates")]//该特性提示存在可视化切换,无其他实际意义,可舍去
    [TemplateVisualState(GroupName = "Flipped", Name = "ViewStates")]
    public class FlipPanel : Control
    {
        public static readonly DependencyProperty CornerRadiusProperty;
        public static readonly DependencyProperty FrontContentProperty;
        public static readonly DependencyProperty BackContentProperty;
        public static readonly DependencyProperty IsFlippedProperty;
        static FlipPanel()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(FlipPanel), new FrameworkPropertyMetadata(typeof(FlipPanel)));
            CornerRadiusProperty = DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(FlipPanel));
            FrontContentProperty = DependencyProperty.Register("FrontContent", typeof(object), typeof(FlipPanel));
            BackContentProperty = DependencyProperty.Register("BackContent", typeof(object), typeof(FlipPanel));
            IsFlippedProperty = DependencyProperty.Register("IsFlipped", typeof(bool), typeof(FlipPanel));
        }
        /// <summary>
        /// 设置控件边框倒角
        /// </summary>
        public CornerRadius CornerRadius
        {
            get
            {
                return (CornerRadius)this.GetValue(CornerRadiusProperty);
            }
            set
            {
                this.SetValue(CornerRadiusProperty, value);
            }
        }
        /// <summary>
        /// 前置内容
        /// </summary>
        public object FrontContent
        {
            get
            {
                return this.GetValue(FrontContentProperty);
            }
            set
            {
                this.SetValue(FrontContentProperty, value);
            }
        }
        /// <summary>
        /// 后置内容
        /// </summary>
        public object BackContent
        {
            get
            {
                return GetValue(BackContentProperty);
            }
            set
            {
                this.SetValue(BackContentProperty, value);
            }
        }
        /// <summary>
        /// 是否翻转
        /// </summary>
        public bool IsFlipped
        {
            get
            {
                return (bool)GetValue(IsFlippedProperty);
            }
            set
            {
                SetValue(IsFlippedProperty, value);
                ChangeVisualState(true);
            }
        }
        public override void OnApplyTemplate()
        {
            ToggleButton btn = GetTemplateChild("FlipButton") as ToggleButton;
            btn.Click += Btn_Click;
            ChangeVisualState(false);
            base.OnApplyTemplate();
           
        }

        private void Btn_Click(object sender, RoutedEventArgs e)
        {
            IsFlipped = !IsFlipped;
           
        }
        void ChangeVisualState(bool useTransition)
        {
            if (IsFlipped)
            {
                VisualStateManager.GoToState(this, "Flipped", useTransition);
            }
            else
            {
                VisualStateManager.GoToState(this, "Normal", useTransition);
            }

        }
    }

4,在UI上添加控件

<local:FlipPanel Grid.Row="1" IsFlipped="True">
            <local:FlipPanel.FrontContent>
                <StackPanel>
                    <Button Content="前1"></Button>
                    <Button Content="前2"></Button>
                    <Button Content="前3"></Button>
                    <Button Content="前3"></Button>
                    <Button Content="前4"></Button>
                </StackPanel>
            </local:FlipPanel.FrontContent>
            <local:FlipPanel.BackContent>
                <StackPanel>
                    <Button Content="后1"></Button>
                    
                </StackPanel>
            </local:FlipPanel.BackContent>
        </local:FlipPanel>

5,效果

6,Demo 链接

https://download.csdn.net/download/lingxiao16888/89253829?spm=1001.2014.3001.5501

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【备忘】Move-ADObject跨子域迁移用户

【背景】由于工作调整&#xff0c;用户需要从A国迁移到B国工作。 - 站在 IT角度&#xff0c;A、B国都是全球根域下的子域&#xff0c;分别为A.domain.com, B.Domain.com。两者是平级的&#xff0c;即使把用户保留的A域里&#xff0c;其实也照常使用。 - 站在HR角度&#xff0…

tkinter 桌面GUI简单计算功能 开发文档

Tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;工具包&#xff0c;用于创建和管理图形用户界面应用程序。Tkinter提供了一组丰富的组件和工具&#xff0c;使开发者能够轻松地构建具有按钮、标签、文本框、菜单等各种交互元素的用户界面。通过Tkinter&#xff0…

<2024年5月软考高项极限冲刺>《2 考试知识块》

&#x1fab8;&#x1fab8;把你所学串起来&#xff0c;欢迎订阅。&#x1fab8;&#x1fab8; 每章附独家脑图&#xff0c;原图。 冲刺 冲刺 冲刺 1 看下面的图&#xff0c;让你知道你要学习的全部知识是什么 2 章节解析 我们考试的重点是项目管理知识&#xff0c;但是因…

【深度学习基础(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说&#xff0c;当前工业界所使用的大部分机器学习…

自适应医疗决策框架 MDAgents:问题复杂度评估 + 医疗决策 + 多智能体协作

自适应医疗决策框架 MDAgents&#xff1a;问题复杂度评估 医疗决策 多智能体协作 提出背景MDAgents 拆解解法&#xff1a;MDAgents框架处理医疗问题3.1 查询复杂性评估例子&#xff1a;糖尿病患者的医疗查询 3.2 专家招募3.3 医疗协作与改良3.4 决策制定 分阶段决策1. 问题复…

优质短视频内容进阶SOP课

本课程致力于提升短视频内容创作标准化操作流程&#xff08;SOP&#xff09;。学员将学习视频策划、拍摄技巧、剪辑方法等&#xff0c;打造高质量短视频内容。通过实例分析和实践演练&#xff0c;学员将掌握优质内容制作的关键步骤&#xff0c;提升影响力和吸引力&#xff0c;成…

机器人系统ros2-开发实践04-ROS 2 启动文件管理大型项目的最佳实践

机器人上的大型应用通常涉及多个互连的节点&#xff0c;每个节点可以有许多参数。海龟模拟器中模拟多只海龟就是一个很好的例子。海龟模拟由多个海龟节点、世界配置以及 TF 广播器和监听器节点组成。在所有节点之间&#xff0c;存在大量影响这些节点的行为和外观的 ROS 参数。 …

浏览器安装路径位置的查看、指定网址快捷方式的创建

浏览器安装路径位置的查看、指定网址快捷方式的创建 浏览器安装路径位置的查看 法一、属性查看法 右键点击浏览器的桌面图标&#xff0c;选择“属性”&#xff0c;“快捷方式”页中的“目标”框中可见. 以Microsoft Edge浏览器为例&#xff0c;参见下图&#xff1a; 法二、地…

基于Spring Boot的心灵治愈交流平台设计与实现

基于Spring Boot的心灵治愈交流平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

远程桌面报错:【出现验证错误。要求的函数不受支持】

WinR 输入【gpedit.msc】回车 依次打开 计算机配置----管理模板-----系统-----凭据分配---加密数据库修正 选择【已启用】&#xff0c;下拉菜单选择【易受攻击】

ROS1快速入门学习笔记 - 014launch启动文件的使用方法

一、定义 Launch文件&#xff1a;通过XML文件实现多节点的配置和启动&#xff08;可自动启动ROSMaster&#xff09; 二、常用语法 1. 根标签 <launch> - launch文件中的根元素采用<launch>标签定义 <launch>表示开始&#xff1b;<launch>表示结束&…

富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 + 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进))

富文本编辑器CKEditor4简单使用-08&#xff08;段落首行缩进插件 处理粘贴 Microsoft Word 中的内容后保持原始内容格式&#xff08;包括首行缩进&#xff09;&#xff09; 1. 缩进&#xff0c;特殊方式处理——修改原工具栏里的增加缩进量2 缩进&#xff0c;插件处理——不含…

[Meachines][Hard]Office

Main $ nmap -sC -sV 10.10.11.3 --min-rate 1000 CMS:joomla # echo 10.10.11.3 office.htb DC.office.htb>>/etc/hosts 在扫描报告中,可以看到robots.txt目录泄露 http://10.10.11.3/administrator/index.php 根据CVE-2023-23752存在未授权访问 http://10.10.11.3/…

【数学建模】2024五一数学建模C题完整论文代码更新

最新更新&#xff1a;2024五一数学建模C题 煤矿深部开采冲击地压危险预测&#xff1a;建立基于多域特征融合与时间序列分解的信号检测与区间识别模型完整论文已更新 2024五一数学建模题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upv…

hive分区上传数据

hive分区上传数据 目录 hive分区上传数据 一、开启HIVE中分区表支持中文字段 二、分区表操作 1.建表语句 2.分区表插入数据 3.查询分区 4.删除分区 5.恢复被删除分区 6.添加分区 7.创建多级分区&#xff08;插入数据与单级分区类似&#xff09; 一、开启HIVE中分区表支…

探索高级聚类技术:使用LLM进行客户细分

在数据科学领域&#xff0c;客户细分是理解和分析客户群体的重要步骤。最近&#xff0c;我发现了一个名为“Clustering with LLM”的GitHub仓库&#xff0c;它由Damian Gil Gonzalez创建&#xff0c;专门针对这一领域提供了一些先进的聚类技术。在这篇文章中&#xff0c;我将概…

Linux下top命令指标说明

目录 Linux下top命令指标说明1. 概览2. CPU利用率3. 内存利用率4. 进程信息 Linux下top命令指标说明 在Linux系统中&#xff0c;top 命令是一个用于实时监视系统运行状态的工具。通过 top 命令&#xff0c;我们可以了解系统的负载情况、CPU利用率、内存使用情况以及各个进程的…

cmake的使用方法: 多个源文件的编译

一. 简介 前面一篇文章学习了针对只有一个 .c源文件&#xff0c;如何编写 CMakeLists.txt内容&#xff0c;从而使用 cmake工具如何编译工程。文章如下&#xff1a; cmake的使用方法: 单个源文件的编译-CSDN博客 本文学习针对 多个 .c源文件&#xff0c; CMakeLists.txt文件如…

【算法设计与分析】实验报告c++实现(矩阵链相乘问题、投资问题、背包问题、TSP问题、数字三角形)

一、实验目的 1&#xff0e;加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、…

Mac环境下ollama部署和体验

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于ollama ollama和LLM&#xff08;大型语言模型&#xff09;的关系&#xff0c;类似于docker和镜像&#xff0c;可以在ollama服务中管理和运行各种LLM&…