Ответ 1
Обычно я создаю отдельный проект стилизации, который я ссылаюсь на проекты, которые я хочу создать. Проект стилизации имеет фиксированную структуру:
Для каждого элемента управления я создаю стиль 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>
В одном из основных ResourceDictionary
я объединим все другие словари, в этом случае в файле 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.