这个文档用来存放一些平时阅读过程中看到的WPF相关知识点,便于回顾与学习。

##1.Dependency Property取值条件的优先级是(从上到下优先级从低到高):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum BaseValueSource
{
Unknown,
Default,
Inherited,
DefaultStyle,
DefaultStyleTrigger,
Style,
TemplateTrigger,
StyleTrigger,
ImplicitStyleReference,
ParentTemplate,
ParentTemplateTrigger,
Local
}

举个栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1 <window>
2 <window.Resources>
3 <style TargetType = "{x:Type Button}" x:key="ButtonStyle">
4 <setter Property="width" value="60"/>
5 <style.trigger>
6 <trigger property="IsMouseOver" value="True">
7 <setter property="width" value="80"/>
8 </trigger>
9 </style.trigger>
10 </style>
11 </window.Resources>
12 <grid>
13 <button x:name="button1" style={staticreource buttonstyle} width="20"/>
14 </grid>
15</window>

上面这段代码中,第4行设置width,优先级为style;第6行设计width,优先级为styletrigger;第13行设计width优先级为local。Local具有最高优先级,所以styletrigger中的设置不起作用。如果去掉13行的设置,鼠标移到button上面就会起作用。

2.SnapsToDevicePixels和UseLayoutRounding

如果发现软件有模糊的情况,尝试使用SnapsToDevicePixels属性。

WPF 4.0后推荐使用UseLayoutRounding。

两者区别在于SnapsToDevicePixels在渲染阶段发生,

而UseLayoutRounding在布局阶段发生。

3.自定义控件

1、一个控件默认会使用它基类的样式,使用DefaultStyleKeyProperty.OverrideMetadate则可以覆盖其基类的样式,从而可以定制它自己的样式;
2、如果一个控件使用了DefaultStyleKeyProperty.OverrideMetadate,则默认会到Themes/Generic.xaml文件中寻找可能的样式;
3、如果一个控件的样式在其它地方(Themes/Generic.xaml之外的地方)也定义了一份,那么会覆盖Themes/Generic.xaml文件中的样式;
4、一个控件删除了DefaultStyleKeyProperty.OverrideMetadate,会导致自动使用其基类的样式,即使在Themes/Generic.xaml文件中定义了这个控件的样式也不会去使用,但如果在Themes/Generic.xaml文件以外的地方定义了它的样式,则会生效。