Что такого особенного в Generic.xaml?

Я пытался выяснить, как организовать файлы ResourceDictionary для повторного использования и совместного использования с другими членами моей команды.

Я продолжаю сталкиваться с "Generic.xaml", но если я посмотрю на MSDN для Generic.xaml или просто выполнил поиск в Google, я, похоже, получаю сообщения в блогах и вопросы форума, которые, возможно, упоминают об этом, t, похоже, наталкивается на что-то действительно авторитетное и ясное.

В чем разница между Generic.xaml и MyRandomlyNamedResourceDictionary.xaml? Кажется, в любом случае, мне нужно ссылаться на ResourceDictionaries, хранящиеся в библиотеках с атрибутом Source.. Например,

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>

Итак, какое преимущество дает Generic.xaml? Имеет ли она какие-либо цели, если я не пытаюсь дать моему приложению несколько "взглядов" (т.е. Если у меня есть только одна тема)?

Ответ 1

Каждый элемент управления в WPF имеет стиль по умолчанию, который обеспечивает, помимо прочего, элемент управления по умолчанию ControlTemplate. WPF ищет стиль по умолчанию в специальном словаре ресурсов в папке "Темы" в той же сборке, что и элемент управления. Ключ для стиля по умолчанию обеспечивается свойством зависимости Control.DefaultStyleKey, значение по умолчанию которого переопределено в каждом подклассе элемента управления.

Название словаря ресурсов зависит от текущей темы Windows, например. на Vista, используя тему Aero, словарь называется Aero.NormalColor.xaml, в XP с использованием темы по умолчанию это Luna.NormalColor.xaml. Если стиль не найден в словаре тем, он выглядит в Generic.xaml i.e для элементов управления, внешний вид которых не зависит от темы.

Это относится только к любым настраиваемым элементам управления, которые вы определили, например, к классам, производным от элемента управления, прямо или косвенно. Вы можете изменить стиль по умолчанию для стандартного элемента управления, извлекая его из него и вызывая DefaultStyleKeyProperty.OverrideMetadata в статическом конструкторе, но затем вам нужно предоставить полный стиль, включая ControlTemplate.

Обратите внимание, что WPF может видеть внешнюю сборку для вашего стиля по умолчанию, используя атрибут ThemeInfo. Внешняя сборка должна быть названа < YourAssembly >. < ThemeName >.dll, например. PresententationFramework.Aero.dll.

Ответ 2

Для файла generic.xaml (без учета регистра), чтобы быть чем-то особенным, необходимо выполнить два условия:

  • Он должен находиться в папке Sub-root Themes в проекте
  • Сборка должна быть отмечена знаком ThemeInfoAttribute (обычно в AssemblyInfo.cs)

Затем он служит местом поиска по умолчанию для любых стилей по умолчанию, которые вы хотите применить к своим элементам управления. Обратите внимание также, что для стиля, который должен быть по умолчанию, он должен объявить как свой TargetType, так и x: Key как тип управления, который должен быть оформлен.

Если вы хотите добавить целые темы и тему переключения в приложение, что выполняется с некоторым кодированием, этот метод просто определяет словарь ресурсов по умолчанию.