В приложении 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>
Для этого есть исправление, но я смог заставить его работать только на уровне окна (не на уровне приложения).
Чтобы включить ресурс 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')
Более подробно об этой проблеме я рассказываю здесь.
Лучшее решение - добавить фиктивный стиль по умолчанию в словарь ресурсов, где вы объединяете все ресурсы вместе.
<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}}" />