Style 的优先级
2024-08-25 09:16:10
Dependency Property(简称DP)是WPF的核心,Style就是基于Dependency Property的,关于DP的内幕,请参见深入WPF--依赖属性。Style中的Setter就是作用在DP上的,如果你在控件中定义了一个CLR属性,Style是不能设置的。Dependency Property设计的精髓在于把字段的存取和对象(Dependency Object)剥离开,一个属性值内部用多个字段来存储,根据取值条件的优先级来决定当前属性应该取哪个字段。
Dependency Property取值条件的优先级是(从上到下优先级从低到高):
1: public enum BaseValueSource
2: {
3: Unknown,
4: Default,
5: Inherited,
6: DefaultStyle,
7: DefaultStyleTrigger,
8: Style,
9: TemplateTrigger,
10: StyleTrigger,
11: ImplicitStyleReference,
12: ParentTemplate,
13: ParentTemplateTrigger,
14: Local
15: }
对于一个具体例子来说:
1: <Window>
2: <Window.Resources>
3: <Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
4: <Setter Property="Width" Value="60"/>
5: <Style.Triggers>
6: <Trigger Property="IsMouseOver" Value="True">
7: <Setter Property="Width" Value="80"/>
8: </Trigger>
9: </Style.Triggers>
10: </Style>
11: </Window.Resources>
12: <Grid>
13: <Button x:Name="button1" Style="{StaticResource ButtonStyle}" Background="{DynamicResource brush}" Width="20"/>
14: </Grid>
15: </Window>
第4行用Style的Setter设置Width=60,这个优先级是Style;第6行当IsMouseOver为True时设置Width=80,这个优先级是StyleTrigger;第13行使用Style的Button定义Width=20,这个优先级是Local。Local具有最高的优先级,所以即使鼠标移到Button上,第6行的Trigger也会因为优先级不够高而不起作用。如果去掉了第13行中的Width=20,那么鼠标移到Button上时Width会变为80,鼠标移开后会回到第4行的设置的60来。
最新文章
- QQ空间/朋友圈类界面的搭建
- Windows Phone 8 开发系列(持续更新中)
- Oracle 索引创建、表分区
- PHP部分资料
- winedt设置自动显示行号[latex]
- SQL Server 数据库安全
- label标签的属性
- ArcGIS API for Silverlight开发入门
- C++,对象的 =赋值 以及 复制构造函数赋值
- KVM客户机使用主机USB设备
- 现在,以编程方式在 Electron 中上传文件,是非常简单的!
- 微信公众平台开发接口PHP SDK
- 初探arch -小白安装arch篇
- 网站开发进阶(二十二)HTML UI知识汇总(更新中...)
- 6 个开源的家庭自己主动化工具 | Linux 中国
- POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解
- 【Spark调优】Shuffle原理理解与参数调优
- BodeAbp概述
- mac安装VMware虚拟机(含序列号)及Ubuntu系统
- macOS下Hive 2.x的安装与配置
热门文章
- [008]new、delete及动态内存分配
- Models and the ServiceManager
- aggregation 详解3(bucket aggregation)
- 微信公众平台接口API
- ArrayBlockingQueue和LinkedBlockingQueue分析
- [记录]使用setTimeout实现不同时间进行切换文本的颜色
- Android, JSONLIB , java.lang.NoClassDefFoundError: Failed resolution of: Lnet/sf/json/JSONArray; 原因
- 类似微博菜单 ,用swift语言编写
- linux文件系统评估之inode
- scala中的call-by-name和call-by-value