it-swarm.com.ru

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

Я пытался выяснить, как организовать мои файлы 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? Имеет ли это какое-либо назначение, если я не пытаюсь придать своему приложению несколько "взглядов" (т. Е. Если у меня есть только одна тема)?

142
devuxer

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

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

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

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

140
Phil Devaney

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

  • Должен быть в папке "Темы" в корневом каталоге проекта.
  • Сборка должна быть помечена ThemeInfoAttribute (обычно в AssemblyInfo.cs)

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

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

96
Kenan E. K.