我通常创建一个单独的样式项目,我从我想要样式的项目中引用它。样式项目具有如下固定结构:
对于每个控件,我都会创建一个样式ResourceDictionary
。例如对于我的按钮:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="PrimaryButtonStyle" TargetType="Button">
</Style>
<Style x:Key="ToolbarButton" TargetType="Button">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Margin" Value="3"/>
<Setter Property="Background" Value="Transparent"></Setter>
</Style>
</ResourceDictionary>
在一个 mainResourceDictionary
中,我合并了所有其他字典,在本例中是 IncaDesign.xaml 文件,您可以在上图中看到:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:Commons.Controls;assembly=Commons">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Converter/Converter.xaml" />
<ResourceDictionary Source="Styles/Button.xaml" />
<ResourceDictionary Source="BitmapGraphics/Icons.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Default Styles -->
<Style TargetType="Button" BasedOn="{StaticResource PrimaryButtonStyle}"></Style>
</ResourceDictionary>
请注意我是如何定义默认样式的,它们会自动应用,除非您另外指定。在您想要设置样式的每个窗口或控件中,您只需要引用这个ResourceDictionary
. 注意源的定义,它是对程序集 ( /Commons.Styling;component...
)的引用
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Commons.Styling;component/IncaDesign.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
现在将自动设置默认样式,如果您想显式访问资源,可以使用StaticResource
.
<Viewbox Height="16" Width="16" Margin="0,0,10,0">
<ContentControl Content="{StaticResource FileIcon32}" />
</Viewbox>
在我看来,这是一个非常好的解决方案,它适用于非常复杂的解决方案,包括模块化解决方案,例如使用 PRISM 构建的解决方案。