Организация ресурсов для шаблонов

74

При использовании шаблонов элементов управления понадобится принять решение относительно того, насколько широко они будут использоваться, и как нужно их применять — автоматически или явно.

Первый вопрос предлагает подумать о том, где должны использоваться шаблоны. Например, будут ли они ограничены определенным окном? В большинстве ситуаций шаблоны элементов управления применяются ко множеству окон и даже ко всему приложению. Во избежание многократного их определения, можно сделать это в коллекции Resources класса Application.

Однако это порождает другой вопрос. Зачастую шаблоны элементов управления разделяются между приложениями. Одно приложение вполне может пользоваться шаблонами, которые разрабатывались отдельно. Тем не менее, приложение может иметь только один файл App.xaml и одну коллекцию Application.Resources. По этой причине лучше определять ресурсы в отдельных словарях ресурсов. Это обеспечит гибкость за счет приведения их в действие в определенных окнах внутри приложения. Это также позволит комбинировать стили, поскольку любое приложение может содержать несколько словарей ресурсов.

Чтобы добавить словарь ресурсов в Visual Studio, щелкните правой кнопкой мыши на проекте в окне Solution Explorer, и выберите в контекстном меню пункт Add --> New Item (Добавить --> Новый элемент), после чего укажите Resource Dictionary (WPF) (Словарь ресурсов (WPF)).

Использовать словари ресурсов легко. К приложению понадобится лишь добавить новый файл XAML с примерно таким содержимым:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
        ...
    </ControlTemplate>
    
</ResourceDictionary>

Хотя все шаблоны можно было бы скомбинировать в одном файле словаря ресурсов, опытные разработчики предпочитают создавать отдельные словари ресурсов для каждого шаблона элемента управления. Дело в том, что шаблон элемента управления довольно быстро может стать достаточно сложным и обрасти целой кучей других связанных с ним ресурсов.

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

Например, пусть необходимо создать настроенные элементы управления Button, CheckBox и RadioButton, которые используют схожий набор цветов. Чтобы упростить решение этой задачи, можно создать отдельный словарь ресурсов для кистей (по имени Brushes .xaml) и объединить его со словарями ресурсов для всех элементов управления (Button.xaml, CheckBox.xaml и RadioButton.xaml).

Шаблон элемента управления по существу жестко кодирует некоторые детали, такие как цветовая схема. Это значит, что если понадобится использовать одинаковую комбинацию элементов в кнопке (Border, Grid, Rectangle и ContentPresenter) и организовать их сходным образом, но в другой цветовой схеме, то придется создать новую копию шаблона, ссылающуюся на другие ресурсы кистей.

Это не обязательно является проблемой (в конце концов, детали компоновки и форматирования могут быть настолько связанными, что все равно они не будут разделяться). Однако это ограничит возможность повторного использования шаблона элемента управления. Если в шаблоне применяется сложная организация элементов, которые должны повторно использоваться с разнообразными деталями форматирования (обычно цветами и шрифтами), эти детали можно извлечь из шаблона и поместить в стиль.

Чтобы решить указанные задачи, понадобится переработать шаблон. Вместо использования жестко закодированных цветов нужно извлекать информацию о свойствах элемента управления через привязки шаблона.

Пройди тесты
Лучший чат для C# программистов