WPF, не применяющий стили по умолчанию, определяется в MergedDictionaries?

В приложении WPF я определил стили управления по умолчанию в отдельных словарях ресурса (например, "ButtonStyle.xaml") и добавил их как объединенные словари к словарю ресурса под названием "ResDictionary.xaml".

Если я отсылаю этот "ResDictionary.xaml" как объединенный словарь в моем App.xaml, стили по умолчанию не применяются. Однако, если я отсылаю "ButtonStyle.xaml", он работает правильно.

Если я перекомпилировал тот же код в.NET 3.5 или 3.0, это распознает и применяет стили по умолчанию, отнесенные в "App.xaml" через "ResDictionary.xaml", но не в.NET 4.0.

Во времени выполнения, если я проверяю Приложение. Текущий. Словарь ресурсов, стили по умолчанию там, но они не применяются, только если я указываю Свойство стиля явно в Кнопочном управлении.

Там какие-либо решения состоят в том, чтобы отослать словарь ресурса (containig стили по умолчанию) этот путь в.NET 4.0?


App.xaml:

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="Styles/ResDictionary.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

ResDictionary.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Default/ButtonStyle.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

ButtonStyle.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="Button">
        <Setter Property="Background" Value="Yellow"/>
    </Style>
</ResourceDictionary>
29
задан George Stocker 5 May 2010 в 16:39
поделиться

2 ответа

Для этого есть исправление, но я смог заставить его работать только на уровне окна (не на уровне приложения).

Чтобы включить ресурс WPF 4.0 из отдельного проекта, ресурс должен быть добавлен как ресурс в код окна. Это утверждение находится в конструкторе окна, перед вызовом метода InitializeComponent:

public ControlsWindow()
{
    this.Resources = Application.LoadComponent(new Uri("[WPF 4.0 ResourceProjectName];Component/[Directory and File Name within project]", UriKind.Relative)) as ResourceDictionary;
    InitializeComponent();
}

Примечание: Замените текст '[WPF 4.0 ResourceProjectName]' на имя проекта вашего ресурса. Кроме того, '[Directory and File Name within project]' нужно заменить на относительное расположение файла ресурса (например, 'Themes/StandardTheme.xaml')

Более подробно об этой проблеме я рассказываю здесь.

1
ответ дан 28 November 2019 в 02:03
поделиться

Лучшее решение - добавить фиктивный стиль по умолчанию в словарь ресурсов, где вы объединяете все ресурсы вместе.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Style/Button.xaml"/>
</ResourceDictionary.MergedDictionaries>

<Style TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" />

23
ответ дан 28 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: