Подтвердить что ты не робот

Стили из 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.
4b9b3361

Ответ 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>