一个较好的style与ControlTemplate结合的示例(以Button为例)
<!--按钮背景画刷-->
<LinearGradientBrush x:Key="buttonBackgroundBrush">
<GradientStop Offset="0" Color="Beige"/>
<GradientStop Offset="1" Color="White"/>
</LinearGradientBrush>
<Sys:String x:Key="bgImg">"..\images\bgImg.png"</Sys:String>
<Color x:Key="bgColorBlack">Black</Color>
<!--按钮模板定义,说明:控件模板不但可以通过拆解控件,并修改可视化元素树来完成;也可以“根据自我想象”,任意地自定义,只要达到需求的效果就好,但这样,程序员可能要写大量的触发器、样式等等,这些效果可以参照“拆解控件”时生成的xaml代码-->
<ControlTemplate x:Key="TestButtonTemplate" TargetType="{x:Type Button}">
<Border x:Name="border" BorderThickness="1" BorderBrush="Black"
Background="{StaticResource buttonBackgroundBrush}"
CornerRadius="10">
<Grid>
<Image x:Name="image" Source="a.png"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Stretch="Fill" Height="50" Width="50"/>
<Label Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/> <!--由于该自定义模板破坏掉button控件原有的很多效果和功能(如:Button控件的Content属性值的外在显示),所以这里使用<Label Content来展示<Button Content的属性值,我们在外部依然是给button按钮的content属性赋值,而这个值在Lable的Content属性值中展示出来,故需要通过“Binding RelativeSource”来获得我们在控件外部输入的Button Content属性值。
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true"><!--针对Button的-->
<Setter TargetName="image" Property="Source" Value="b.png"/><!--但它针对Button的组成元素之一:“images”,而不针对其它的组成元素-->
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate> <!--数据模板是描述“数据项”风格的一种模板,数据集合中所有数据记录的风格都是一致的;控件模板是针对控件的外在显示,而与数据是无关的;数据模板是针对数据项的、控件模板是针对控件的;数据模板是渲染控件中的数据的、控件模板是渲染控件自身的,不包括数据-->
<!--按钮样式定义,实际只需要在Button的Style中引用这个就好-->
<Style x:Key="TestButtonStyle" TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="bold"/>
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="Foreground" Value="Blue"/>
<Setter Property="Template" Value="{StaticResource TestButtonTemplate}"/><!--good-->
</Style>
说明:上例中的Style、ControlTemplate、LinearGradientBrush等元素,都属于“资源”(而不是控件),所以通常放在资源区域 或 资源字典 中。可以把用户控件和window整体分为“资源区域”和“布局区域”,资源区域存放各种资源(如:style,controltemplate、datatemplate、string、brush等,并且资源的标识是x:key);布局区域存放各种控件(如:grid,button,textbox等等,并且控件的标识是x:name),需要注意的是,许多控件自身也有resouce。
WPF重要知识回顾:
Style、ControlTemplate、DataTemplate三者可以并列,后两者也可以嵌入到Style当中;另外,这三者都可以有“自己的”触发器
依赖属性(通常被控件拥有,它可以Binding到ViewModel的属性上),路由事件(可导致对应的“事件触发器”被触发)
触发器:属性,数据,事件(路由事件的激发 会 导致 事件触发器 被激发,事件触发器中,通常使用动画处理),使用触发器的意义:主要是为了产生“界面效果”。补充:Style、ControlTemplate、DataTemplate 和 UIElement都有Triggers
动画:经常使用Storybord来实现动画效果
综上所述:以上这些知识都是为了产生界面效果的,所以WPF的核心就是为了渲染界面效果的。
一个较好的style与ControlTemplate结合的示例(以Button为例)的更多相关文章
- Style、ControlTemplate 和 DataTemplate 触发器
本文摘要: 1:属性触发器: 2:数据触发器: 3:事件触发器: Style.ControlTemplate 和 DataTemplate 都有触发器集合. 属性触发器只检查W ...
- java 添加一个线程、创建响应的用户界面 。 演示示例代码
javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章 部分的代码 夹21.2.11 thinking in java 4免费下载: ...
- [deviceone开发]-一个固定列,可以上下左右滑动的表格示例
一.简介 一个类型table的例子,第一列和第二列可以固定,剩下的后面的很多列都可以左右滑动,也可以上下滑动,这种需求一般是为了展示多列表格数据.这个例子是通过二大部分: 左边是一个普通的listvi ...
- Erlang 进程被抢占的条件——一个进程长时霸占调度器的极端示例
最近研究 binary 的实现和各种操作对应的 beam 虚拟机汇编指令,发现有一些指令序列是不可重入的,比如说有的指令构造一个上下文(也就是某种全局状态),然后下一条指令会对这个上下文做操作(具体的 ...
- 一个非常标准的Java连接Oracle数据库的示例代码
最基本的Oracle数据库连接代码(只针对Oracle11g): 1.右键项目->构建路径->配置构建路径,选择第三项“库”,然后点击“添加外部Jar”,选择“D:\Oracle\app\ ...
- 一个js变量以及其作用域的源码示例
今天遇到了一个问题,抽象出来的代码如下: var zoom=13; function setZoom(){ zoom=14; } function displayZoom(){ this.setZoo ...
- 当你输入一个网址/点击一个链接,发生了什么?(以www.baidu.com为例)
>>>点击网址后,应用层的DNS协议会将网址解析为IP地址: DNS查找过程: 浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束. 如果用户 ...
- 把一个窗体嵌入到WinForm中进行显示,以CMD窗口为例
1.添加引用 using System.Runtime.InteropServices; 2. 加入以下代码段 [DllImport("User32.dll ", EntryPoi ...
- 给大家推荐一个C#下的Ribbon风格的Forms实现示例-含源码
C#下的Ribbon风格的Forms实现示例:源码下载地址
随机推荐
- Tomcat 服务器介绍
Tomcat 目录介绍 Tomcat 主目录有 bin, conf, lib, logs, temp, webapps, work 7个文件夹 bin 目录 主要用来存放 tomcat 命令 .sh ...
- 3.Write Scripts for the mongo Shell-官方文档摘录
总结 1 使用js进行获取数据的方法 2 js方式和原生mongo shell的交互方式的区别写法 3 需要将所有数据打印出来使用到的循环示例 cursor = db.collection.find( ...
- Mysql数据库(表)的导出和导入小结
Why? 有人因为想看导出的开房记录库文件,然后学会了Mysql数据库文件的导入操作~: 有人因为工作原因,要用到数据库的备份与导入,然后应需学会了骚操作~: 我因为~~emmm 想看某个导出的库文件 ...
- Virtualbox报错------>make sure the kernel module has been loaded successfully
错误描述 很久没有用virtualbox了,今天打算在virtualbox上安装一个Ubuntu系统的时候,新建好Ubuntu后启动的时候,直接报错: Cannot access the kernel ...
- node.js---sails项目开发(2)
1.安装mongoDB,这里用brew安装 brew install mongodb 2. 启动数据库 mongod 3.再打开一个终端,连接数据库 mongo 4.启动成功后,接下来就是新建一个数据 ...
- 利用python的turtle重复画六边形
学习python,接触到turtle包,就用它来画一下六边形. 要在python中使用turtle包,就先要安装这个包.安装步骤如下:按住win+R,在打开CMD,输入命令'pip install t ...
- 微信小程序组件button
表单组件button:官方文档 Demo Code: var types=['default', 'primary', 'warn']; var pageObject = { data: { defa ...
- appcmd应用
appcmd资料: http://www.jb51.net/article/36024.htm 官方文档:https://docs.microsoft.com/zh-cn/iis/get-starte ...
- 112. Path Sum (判断路径和是否等于某值)
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up a ...
- 用cmd运行php代码、socket
一.用cmd运行php代码,首先要对电脑进行配置: 1.右击计算机-属性-高级系统设置-环境变量,我们需要添加环境变量. 2.在Administrator的用户变量(U)下点击新建,弹出对话框,变量名 ...