WPF控件的默认样式的查看、自定义样式(含控件模板)的放置位置
(一)查看样式
WPF中常用控件都有一个默认的自定义样式,在Visual Studio中不能直接查看(???是否确实没有办法查看,如果表达不当,请见谅),但是在Blend for Visual Studio 中可以通过模板来查看。
如下所示:
(1)在左下角的“对象和时间线”面板中,找到相应的控件,右键点击打开上下文菜单,点击 编辑模板->编辑副本。
(2)选择样式的名称(关键字)和定义位置。
在“名称(关键字)”中,如果选第一行,则样式含有自定义的x:Key属性;若选第二行,则没有key,会自动为指定Type应用样式。
在“定义位置”中,第一行“应用程序”表示样式会放到app.xaml中,第二行放到当前xaml文档中;第三行表示自定义资源字典。
(3)点击确定后就生成了相应的样式,样式中也包含ControlTemplate。这是就可以自己来更改了。
(二)自动样式的存放位置
对于只有TargetType属性而没有x:Key属性的样式, 例如 <Style TargetType="{x:Type CheckBox}">,系统将自动为所有作用域内的该类型元素应用此样式。
比如一个最简单的程序,主窗口中含有一个checkBox和一个自定义UserControl控件MyBox,在MyBox中也含有CheckBox:
<Window x:Class="WpfApp19.MainWindow"
.........(此处省略多行)>
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<!--此处有一个CheckBox-->
<CheckBox Margin="30,10" Grid.Row="1">checkbox</CheckBox>
<!--MyBox是自定义的UserControl,其中也含有两个CheckBox-->
<local:MyBox Margin="30,10" Grid.Row="2"></local:MyBox>
</Grid>
</Window>
<!--MyBox控件中含有CheckBox-->
<UserControl x:Class="WpfApp19.MyBox"
。。。。。。。。(省略多行) >
<StackPanel>
<CheckBox>1</CheckBox>
<CheckBox>2</CheckBox>
</StackPanel>
</UserControl>
那 <Style TargetType="{x:Type CheckBox}">格式的样式文件放在哪里呢?
(1)放在app.xaml中,那么MainWindow和MyBox中的CheckBox都自动应用该样式,会覆盖掉WPF系统自身为CheckBox配置的默认样式。
(2)放在MainWindow.xaml中,那么MainWindow和MyBox中的CheckBox也都自动应用该样式,会覆盖掉WPF系统自身为CheckBox配置的默认样式。
(3)放在MyBox.xaml中,那么仅仅MyBox中的2个checkBox会使用该样式,而MainWindow.xaml中的那1个checkBox仅仅使用WPF的默认样式。
(4)如果放在单个控件内部,则仅该控件可以使用。
结论:
(i)WPF系统为其控件配置的默认样式,是具有较低的优先级的。无论在App.xaml或MainWindow.xaml还是控件自身xaml中,都可以用定制的样式来覆盖默认样式。如果在App.xaml中已经配置了样式,在下级xaml中就不需要重复配置相同的样式了,下级控件会递归向上查找相应的资源。
(ii)可以利用Blend for Visual Studio程序取得默认的样式文件,并在此基础上进行修改来定制自己需要的样式。