Я пытался выяснить, как организовать мои файлы 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? Имеет ли это какое-либо назначение, если я не пытаюсь придать своему приложению несколько «взглядов» (т. Е. Если у меня есть только одна тема)?
Ответы:
Каждый элемент управления в WPF имеет стиль по умолчанию, который обеспечивает, помимо прочего, элемент управления по умолчанию
ControlTemplate
. WPF ищет стиль по умолчанию в специальном словаре ресурсов в папке Темы в той же сборке, что и элемент управления. Ключ для стиля по умолчанию предоставляетсяControl.DefaultStyleKey
свойством зависимости, значение по умолчанию которого переопределяется в каждом подклассе элемента управления.Название словаря ресурсов зависит от текущей темы Windows, например, в Vista, в которой используется тема Aero, словарь называется Aero.NormalColor.xaml, в XP, в которой используется тема по умолчанию, это Luna.NormalColor.xaml. Если стиль не найден в словаре темы, он ищет в Generic.xaml, т.е. для элементов управления, внешний вид которых не зависит от темы.
Это относится только к любым пользовательским элементам управления, которые вы определили, т. Е. К классам, производным от Control, прямо или косвенно. Вы можете изменить стиль по умолчанию для стандартного элемента управления, наследуя его и вызывая
DefaultStyleKeyProperty.OverrideMetadata
статический конструктор, но затем вам необходимо предоставить полный стиль, включая ControlTemplate.Обратите внимание, что вы можете указать WPF искать во внешней сборке ваш стиль по умолчанию, используя атрибут ThemeInfo. Внешняя сборка должна называться
<
YourAssembly>
.<
ThemeName>
.dll, например PresententationFramework.Aero.dll.источник
Чтобы
generic.xaml
файл (без учета регистра) был чем-то особенным, должны быть выполнены два условия:ThemeInfoAttribute
(обычно вAssemblyInfo.cs
)Затем он служит местом поиска по умолчанию для любых стилей по умолчанию, которые вы хотите применить к своим элементам управления. Также обратите внимание, что для того, чтобы стиль был стилем по умолчанию, он должен объявить как TargetType, так и x: Key как тип элемента управления, который должен быть стилизован.
Если вы хотите добавить в приложение целые темы и переключение тем, что выполняется с помощью некоторого кодирования, этот метод просто определяет словарь ресурсов по умолчанию.
источник
x:Key
в письменном виде<Button Style="{StaticResource MyButtonStyle}" />
? Что произойдет, если ResourceDictionary содержит более одного стиля, для которого TargetType имеет значение «Button»? Спасибо.h1 {color:#00ff00}
?