WPF не применяет стили по умолчанию, определенные в MergedDictionaries? - PullRequest
29 голосов
/ 02 мая 2010

В приложении 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>

Ответы [ 3 ]

23 голосов
/ 02 июля 2010

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

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

4 голосов
/ 27 октября 2010

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

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

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

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

1 голос
/ 04 мая 2010

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

Чтобы включить ресурс 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]» именем проекта вашего ресурса. Кроме того, «[Имя каталога и файла в проекте]» необходимо заменить относительным расположением файла ресурса (например, «Themes / StandardTheme.xaml»)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...