Стили из generic.xaml не применяются
Я создал сборку библиотеки классов, в которой я создал пользовательские элементы управления, и я определил стили по умолчанию в файле generic.xaml.
Кажется, это довольно распространенная проблема, поскольку многие люди публикуют об этом.
Однако я не мог найти полезного ответа для моего случая.
- файл generic.xaml находится в папке "Темы".
- Файл generix.xaml Build Action установлен на страницу.
- ThemeInfo правильно определен в моей AssemblyInfo.cs.
В моем тестовом приложении, если я вручную объединить файл generic.xaml из сборки пользовательских элементов управления в файл приложения App.xaml следующим образом:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
тогда пользовательские элементы управления будут правильно оформлены, но если я не буду вручную объединять generic.xaml, элементы управления появятся со стандартной темой Windows.
Не могли бы вы рассказать мне, что я забываю и/или делаю неправильно?
Дополнительная информация:
-
Атрибут сборки My ThemeInfo определяется следующим образом:
[assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]
(Примечание: результат совпадает с любой комбинацией параметров для атрибута ThemeInfo)
-
В папке "Темы" есть еще два файла .xaml рядом с файлом generic.xaml.
- В папке Themes есть вложенная папка, в которой содержится другой файл .xaml.
Ответы
Ответ 1
Вам понадобится следующая строка в вашем настраиваемом конструкторе:
public class MyCustomControl : Control
{
static MyCustomControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));
}
}
Затем, если у вас есть файл generic.xaml в папке тем, со следующим стилем образца:
<Style TargetType="{x:Type local:MyCustomControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyCustomControl}">
<Border>
<Label>Testing...</Label>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Теперь стиль будет автоматически применяться без дополнительного слияния.
Ответ 2
Чтобы применить стили по умолчанию в Themes\Generic.xaml в моей библиотеке пользовательских элементов управления, я решил искать вдохновение из хорошо установленной библиотеки управления с открытым исходным кодом (MahApps). Этот проект дает вам действительно хороший пример того, как структурировать и размещать библиотеку пользовательских элементов управления.
Сократите длинную историю, чтобы получить стили по умолчанию в Themes\Generic.xaml, вам нужно включить следующее в файл AssemblyInfo.cs в свою библиотеку пользовательских элементов управления:
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
В моем случае мои пользовательские элементы управления AssemblyInfo.cs выглядели примерно так:
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Markup;
[assembly: AssemblyCopyright("...")]
[assembly: ComVisible(false)]
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0.0")]
[assembly: AssemblyTitleAttribute("...")]
[assembly: AssemblyDescriptionAttribute("")]
[assembly: AssemblyProductAttribute("...")]
[assembly: AssemblyCompany("...")]
Ответ 3
Не уверен, что это работает в WPF, но работает для меня в Silverlight:
Конструктор:
public class MyCustomControl : Control
{
static MyCustomControl()
{
this.Style = (Style)Application.Current.Resources["MyCustomControlStyle"];
}
}
Стиль:
<Style x:Key="MyCustomControlStyle" TargetType="{local:MyCustomControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{local:MyCustomControl}">
<Border>
<Label>Testing...</Label>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>