Что такого особенного в Generic.xaml? - PullRequest
142 голосов
/ 04 августа 2009

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

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

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

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

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

Ответы [ 2 ]

141 голосов
/ 05 августа 2009

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

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

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

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

96 голосов
/ 04 августа 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...