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.

Во время выполнения, если я проверяю словарь Application.Current.Resources, существуют стили по умолчанию, но они не применяются, только если я задал свойство Style явно в элементе управления Button.

Существуют ли какие-либо решения для ссылки на словарь ресурсов (содержащие стили по умолчанию) таким образом в .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>

Ответ 1

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

Чтобы включить ресурс WPF 4.0 из отдельного проекта, ресурс должен быть добавлен как ресурс в коде Windows. Оператор относится к конструктору Windows перед вызовом метода 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] "своим именем проекта ресурса. Кроме того," [Каталог и имя файла внутри проекта] "необходимо заменить относительным расположением файла ресурсов (например," Темы/СтандартTheme.xaml")

Я расскажу подробнее об этой проблеме здесь.

Ответ 2

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

<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}}" />

Ответ 3

Это может быть вызвано известной ошибкой, когда в приложении используется один стиль в приложении. Ресурсы в файле app.xaml, если вы не используете startupuri.

Исправление состоит в том, чтобы добавить дополнительный стиль, подобный этому...

...
   <Style x:Key="unused" />
</Application.Resources>

для более подробной информации ознакомьтесь с этой ссылкой.... http://bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-ignored