Подтвердить что ты не робот

Как организовать ресурсы (стили,...) в сложном сценарии WPF?

Как можно создать ресурсы WPF, включая стили, шаблоны и т.д., чтобы я мог использовать их в Windows, Pages или даже в проектах. Какие параметры у меня есть для достижения максимального повторного использования моих ресурсов и поддерживаемой структуры (например, одного файла на шаблон)?

Например: я создаю приложение WPF, и я хочу использовать TabControl, но хочу внести в него серьезные изменения. Поэтому я мог бы создать стиль и применить его к TabControl и TabItem. Это нормально, но где я могу разместить свои ресурсы, чтобы очистить Window XAML и иметь стиль, доступный из других Windows или проектов?

Я обнаружил, что могу добавить его в App.xaml, но это всего лишь решение для одного проекта и позволяет совместно использовать только элементы этого проекта. Кроме того, я думаю, было бы лучше, если бы эти шаблоны были немного отделены от другого кода, чем размещать его на какой-либо странице или app.xaml?

4b9b3361

Ответ 1

Обычно я создаю отдельный проект стилизации, который я ссылаюсь на проекты, которые я хочу создать. Проект стилизации имеет фиксированную структуру:

Styling project

Для каждого элемента управления я создаю стиль 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.

Ответ 3

Вы можете создать проект, содержащий словари ресурсов, либо в вашем решении, либо в отдельном. Ваш проект будет типом библиотеки классов, и тогда его можно будет легко использовать как .dll из любого другого проекта. Вот статья, описывающая это: ресурсная статья словаря статей