WPF入门第三篇 ControlTemplate、Trigger与Storyboard

news2024/11/28 12:54:44

ControlTemplate、Trigger与Storyboard

ControlTemplate通常用在Style中,Trigger通常作为ControlTemplate的一部分,StoryBoard表示动画效果,下面将通过对Button按钮设置这几项来简单说明这几项的用法。
在MainWindow中添加一个Button按钮;在Window段添加resource段,并在其中添加一个Style:

<Window x:Class="WpfControlTemplateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        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="clr-namespace:WpfControlTemplateTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
  <Window.Resources>
    <ResourceDictionary>
      <Style TargetType="Button">
        <Setter Property="Width" Value="100"></Setter>
        <Setter Property="Height" Value="40"></Setter>
        <Setter Property="Background" Value="LightGreen"></Setter>
        <Setter Property="BorderThickness" Value="0"></Setter>
        <Setter Property="Foreground" Value="White"></Setter>
      </Style>
    </ResourceDictionary>
  </Window.Resources>
  <Grid>
    <Button Name="btn1" Content="btn1"></Button>
  </Grid>
</Window>

此时的显示效果是这样的:
在这里插入图片描述

按钮样式改变了很多,但是很多时候我们都需要圆角按钮,为了让按钮变成圆角,我们需要设置按钮的Template属性。将下面的setter添加到我们的style中即可。

<Window x:Class="WpfControlTemplateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        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="clr-namespace:WpfControlTemplateTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
  <Window.Resources>
    <ResourceDictionary>
      <Style TargetType="Button">
        <Setter Property="Width" Value="100"></Setter>
        <Setter Property="Height" Value="40"></Setter>
        <Setter Property="Background" Value="LightGreen"></Setter>
        <Setter Property="BorderThickness" Value="0"></Setter>
        <Setter Property="Foreground" Value="White"></Setter>
        <!--添加的代码-->
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="Button">
              <Grid>
                <Border CornerRadius="10" Background="LightGreen"></Border>
                <!--注意这里-->
                <ContentPresenter
                                  Content="{TemplateBinding Content}"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  Margin="{TemplateBinding Padding}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  />
              </Grid>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
        <!--到此为止-->
      </Style>
    </ResourceDictionary>
  </Window.Resources>
  <Grid>
    <Button Name="btn1" Content="btn1"></Button>
  </Grid>
</Window>

现在的显示效果:
在这里插入图片描述

通过使用ControlTemplate,可以定制化控件的模板样式。

  • WPF给我们提供了一个ContentPresenter,它的作用就是把原有模板的属性原封不动的投放到自定义模板中。

Trigger通常在ControlTemplate中定义,用来实现Hover、Press等效果。
比如,我们希望btn1在hover时,width变为200,(翻译成人话:鼠标悬停在按钮上的时候,按钮长度变为200)则可以在ControlTemplate段中添加下面代码:

<Window x:Class="WpfControlTemplateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        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="clr-namespace:WpfControlTemplateTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
  <Window.Resources>
    <ResourceDictionary>
      <Style TargetType="Button">
        <Setter Property="Width" Value="100"></Setter>
        <Setter Property="Height" Value="40"></Setter>
        <Setter Property="Background" Value="LightGreen"></Setter>
        <Setter Property="BorderThickness" Value="0"></Setter>
        <Setter Property="Foreground" Value="White"></Setter>
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="Button">
              <Grid>
                <Border CornerRadius="10" Background="LightGreen"></Border>
                <ContentPresenter
                                  Content="{TemplateBinding Content}"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  Margin="{TemplateBinding Padding}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  />
              </Grid>
              //添加的代码
              <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                  <Setter Property="Width" Value="200"></Setter>
                </Trigger>
              </ControlTemplate.Triggers>
              //到此为止
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </ResourceDictionary>
  </Window.Resources>
  <Grid>
    <Button Name="btn1" Content="btn1"></Button>
  </Grid>
</Window>

运行后的悬停前、悬停后效果对比:

此时,如果想为按钮的变化添加动画效果,就需要设置Storyboard。我们需要将ControlTemplate.Triggers段替换为如下代码:

<ControlTemplate.Triggers>
  <Trigger Property="IsMouseOver" Value="True">
    <Trigger.EnterActions>
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation Storyboard.TargetProperty="Width" To="200" Duration="0:0:0.15"></DoubleAnimation>
        </Storyboard>
      </BeginStoryboard>
    </Trigger.EnterActions>
    <Trigger.ExitActions>
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation Storyboard.TargetProperty="Width" To="100" Duration="0:0:0.1"></DoubleAnimation>
        </Storyboard>
      </BeginStoryboard>
    </Trigger.ExitActions>
  </Trigger>
</ControlTemplate.Triggers>

这里的DoubleAnimation指的是数字变化的动画,若需要颜色变化,则需要ColorAnimation。DoubleAnimation的Duration属性是一个时间,分别被设置了0.15秒和0.1秒。
运行效果:
在这里插入图片描述在这里插入图片描述

此时,如果想为按钮的变化添加动画效果,就需要设置Storyboard。我们需要将ControlTemplate.Triggers段替换为如下代码:

<ControlTemplate.Triggers>
  <Trigger Property="IsMouseOver" Value="True">
    <Trigger.EnterActions>
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation Storyboard.TargetProperty="Width" To="200" Duration="0:0:0.15"></DoubleAnimation>
        </Storyboard>
      </BeginStoryboard>
    </Trigger.EnterActions>
    <Trigger.ExitActions>
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation Storyboard.TargetProperty="Width" To="100" Duration="0:0:0.1"></DoubleAnimation>
        </Storyboard>
      </BeginStoryboard>
    </Trigger.ExitActions>
  </Trigger>
</ControlTemplate.Triggers>

在这里插入图片描述

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

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

相关文章

Prometheus技术分享——如何监控宿主机和容器

这一期主要来跟大家聊一下&#xff0c;使用node_exporter工具来暴露主机和因公程序上的指标&#xff0c;利用prometheus来监控宿主机&#xff1b;以及通过通过Cadvisor监控docker容器。 一、部署node_exporter监控宿主机 1 下载软件包 wget https://github.com/prometheus/n…

分布式链路追踪SkyWalking

文章目录目录介绍服务端搭建注册中心启动注册中心修改持久化配置UI服务配置启动服务客户端搭建目录介绍 重要的目录结构分析如下&#xff1a; agent&#xff1a;客户端需要指定的目录&#xff0c;其中有一个jar&#xff0c;就是负责和客户端整合收集日志bin&#xff1a;服务端…

深入理解Linux网络技术内幕(十三)——协议处理函数

文章目录前言网络协议栈概论大蓝图Ethernet的链路层的选择&#xff08;LLC和SNAP&#xff09;网络协议栈的操作方式执行正确的协议处理函数特殊媒介封装协议处理函数的组织协议处理函数的注册Ethernet与IEEE 802.3帧设置封包类型设置Ethernet协议及长度逻辑链接控制&#xff08…

python+django球鞋商品竞拍卖网站vue

管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码、角色等信息&#xff0c;输入完成后选择登录即可进入网上球鞋竞拍系统 管理员登录进入网上球鞋竞拍系统可以查看球鞋分类管理、热门竞拍管理、科比展区管理、用户管理、竞拍信息管理、消息通知管理、用户评价管理、…

单人脸的关键点检测

闲暇之余做了一个简单的单人的脸部关键点检测&#xff0c;使用的pytorch框架&#xff0c;别人训练好的现成模型。其中人脸检测模型是YOLOface5&#xff08;onnx格式的权重&#xff09;&#xff0c;关键点检测模型是PFLD&#xff08;能检测98个关键点&#xff09;&#xff0c;是…

计算机网络学习笔记(Ⅳ):网络层

目录 1 网络层内容 1.1 功能概述 1.任务 2.主要功能 1.2 数据交换方式 1.电路交换 2.报文交换 3.分组交换 4.方法对比 1.3 分组交换 1.数据报方式 2.虚电路方式 3.对比 2 路由算法与路由协议 2.1 路由算法 2.2 路由选择协议 3 IPv4 3.1 IP数据报格式 1.TCP/…

快2023年了,还不会性能调优?阿里技术官亲授“Java性能调优技术宝典”看完直接涨薪5K

一、前言 什么是性能调优&#xff1f; 性能调优其实很好理解&#xff0c;就是优化硬件、操作系统、应用之间的一个充分的协作&#xff0c;最大化的发挥出硬件的极致性能&#xff0c;来应对高负载的业务需求。 为什么需要性能优化&#xff1f; 其实说到底就是两个原因&#…

2023年湖北安全员ABC三类人员延期多久一次?甘建二

2023年湖北安全员ABC三类人员延期多久一次&#xff1f; 2023年湖北安全员ABC延期快来找甘建二报名&#xff0c;建设厅指定的 2023年湖北安全员ABC新办快来找甘建二报名&#xff0c;建设厅指定的 首先安全员分为三类&#xff1a;A证、B证、C证&#xff0c;每个证书都有相应的…

Spring源码解析-环境变量(下)

“不积跬步&#xff0c;无以至千里”。 接着聊上一篇文章中遗留的两个重要问题&#xff1a; 如何往Spring环境变量中添加自定义的环境变量&#xff1f;工作原理是什么&#xff1f;PropertyPlaceholderConfigurer这个类是怎么完成bean属性填充时“$”符号解析工作的&#xff1f…

数据库系统概论第2章 关系数据库

易错点1&#xff1a;实体完整性 实体完整性要求主属性不能取空值 而主属性不能取空值≠候选码不为空 因为候选码可以是两个属性的组合&#xff0c;而主属性是候选码的属性 举个例子&#xff1a; SC表中候选码为&#xff08;学号&#xff0c;课程号&#xff09; 主属性为学…

fetch向后端请求数据:get/post/put/patch/delete方式、解决catch不能主动捕获错误问题(超详细笔记)

1、什么是fetch&#xff1a; fetch是ES6出现的&#xff0c;它使用了 ES6 提出的 promise 对象&#xff0c;为了取代XMLHttpRequest而诞生的&#xff1b;提到XMLHttpRequest就不得不提ajax&#xff0c;ajax是一种实现前后端交互的技术&#xff0c;而ajax是基于XMLHttpRequest模块…

C++ Reference: Standard C++ Library reference: Containers: map: map: count

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/count/ 公有成员函数 <map> std::map::count size_type count (const key_type& k) const;计数具有特定键的元素 在容器中搜索键值等于k的元素&#xff0c;并返回匹配的数量。 因为map容器中的所…

搞懂商业智能 BI 、数据仓库、数据中台及其关系,此文足以

数字化如火如荼&#xff0c;企业的 IT 信息化也越演越烈&#xff0c;企业管理者对数据管理也是越来越重视&#xff0c;认识到数据资产带来的价值&#xff0c;本文对这些名词术语及内涵进行系统的解析&#xff0c;便于读者对数据平台相关的概念有全面的认识。 商业智能BI 商业…

本文分享Unity中的AI算法和实现3-有限状态机FSM(下)

本文分享Unity中的AI算法和实现3-有限状态机FSM(下) 回家生孩子, 暂停了一个多月的更新, 今天重新续上, ^_^. 在上一篇文章中, 我们分享了状态机的基本理论, 然后结合Unity的Animator来熟悉了这些理论, 最后设计了我们自己的状态机并实现了框架部分. 这一篇文章, 我们将继续…

20221212 SpringCloud Alibaba

Spring Cloud Alibaba介绍主要功能组件注册中心脚手架创建实例使用RestTemplate实现微服务调用使用openfeign实现微服务调用负载均衡的使用创建多实例修改负载均衡Spring Cloud Alibaba 介绍 官方文档&#xff1a; https://spring.io/projects/spring-cloud-alibaba https://…

git stash 命令详解

1. 应用场景 2. 添加储藏 3. 查看储藏 4. 删除储藏 5. 使用储藏 6. 常见用法 1. 应用场景 git stash 命令用于将工作区中的更改和暂存区中的内容储存起来 日常开发中&#xff0c;会经常遇到这种场景 我们正在 dev 分支开发新功能&#xff0c;做到一半时&#xff0c;产品经理…

模块化、组件化和插件化

模块化&#xff1a;业务解耦、代码重用 组件化&#xff1a;模块化为基础、开发阶段每个moudle都是一个app &#xff0c;可以单独编译,并行开发 互不干扰&#xff0c;不用编译整个工程&#xff0c;打包的时候每个moudle又是moudle 不是app 只有一个app 插件化&#xff1a;也是…

【愚公系列】2022年12月 Elasticsearch数据库-ELK环境的搭建(一)

文章目录前言一、ELK环境的搭建1.前提条件2.启动Elasticsearch3.配置可视化工具 head-master3.配置kibana前言 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat&#xff0c;它是一个轻量级…

大学生可以在校搞搞副业吗?尝试做外卖跑腿项目有没有市场?

随着大学寒假的即将到来&#xff0c;40多天的假期&#xff0c;为什么大学生不利用这个机会去想明年的校园生活该如何度过&#xff0c;想要自己的校园生活过得精彩&#xff0c;就给自己找一个副业吧&#xff01; 副业&#xff01;这两个词应该是针对工作的&#xff0c;而不是针…

MapReduce 编程实例:词频统计

文章目录MapReduce 编程实例&#xff1a;词频统计一&#xff0c;准备数据文件&#xff08;1&#xff09;在虚拟机上创建文本文件&#xff08;2&#xff09;上传文件到HDFS指定目录二&#xff0c;使用IDEA创建Maven项目三&#xff0c;添加相关依赖四&#xff0c;创建日志属性文件…