2014-09-15 2 views
2

В моем словарном файле у меня естьWPF стиль переопределения в объединенном словаре

<Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}"> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Background" Value="Black" /> 
</Style> 

В моем файле XAML окна У меня есть

<Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/XXX;component/XXX.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 

      <Style TargetType="Label" BasedOn="{StaticResource {x:Type Label}}"> 
       <Setter Property="FontSize" Value="20"/> 
       <Setter Property="VerticalAlignment" Value="Center"/> 
      </Style> 
     </ResourceDictionary> 
    </Window.Resources> 

В конструкторе можно увидеть на этикетке имеет черный фон и белый передний план но во время выполнения он имеет черный черный фон по умолчанию и прозрачный фон. Очень очевидно, что я хочу наследовать стиль словаря, и он не работает. Что я там делал? Я использую VS 2013 и .NET 4.5

Редактировать: Если я удалю стиль внутри Windows.Resources, тогда будет применен стиль словаря. Если переместить стиль из ресурсов Windows на StackPanel.Resource, который содержит некоторые метки, то наследование работает отлично

ответ

3

Согласно MSDN, Merged Resource Dictionaries:

If a key is defined in the primary dictionary and also in a dictionary that was merged, then the resource that is returned will come from the primary dictionary.

Согласно этому правилу, ваш второй стиль находится первым. Этот стиль затем ссылается на стиль с тем же ключом {x:Type Label}. По какой-то причине это разрешается до null. Однако проверка первого стиля показывает, что ссылка на BasedOn была решена по умолчанию, как и ожидалось. То же самое происходит, когда в обоих стилях указывается один и тот же явный ключ. Однако все работает так, как ожидалось, когда им дают разные ключи.

Я предполагаю, что второй стиль затеняет первый. Возможно, ссылка BasedOn разрешена самим стилем, но для предотвращения циклических зависимостей она имеет значение null.

Лично я хотел бы использовать явные ключи. Для стилей, которые должны быть применены ко всем элементам определенного типа, но по-прежнему должны быть перекрыты в некоторых случаях, я бы разделить вещи на два стиля:

// The actual style, with all its setters, is given a descriptive name: 
<Style x:Key="DescriptiveName" TargetType="Label" BasedOn="{StaticResource {x:Type Label}}"> 
    // Setters go here 
</Style> 

// A 'dummy' style that references the above style. 
// Its sole purpose is to apply the style to all elements of the target type. 
<Style TargetType="Label" BasedOn="{StaticResource DescriptiveName}" /> 

Когда вам необходимо изменить стиль, вы можете однозначно указать его по его названию:

<Style TargetType="Label" BasedOn="{StaticResource DescriptiveName}"> 
    // Overriding setters go here 
</Style> 
+0

Ну, словарь - это словарь глобального стиля. Который я стараюсь избегать делать style = {...} или создавать другой стиль в словаре, если я не хочу переопределять что-либо. – Steve

+0

Вот для чего нужен фиктивный стиль. Вы помещаете именованный стиль и фиктивный стиль в глобальный словарь. Эффект такой же, как наличие одного стиля без ключа, но его разделение позволяет также явно ссылаться на стиль. Что может быть полезно для решения этой проблемы с объединенным словарем. –

+0

кажется рабочим решением. Есть ли еще идеи о фактическом поведении, которое вызвало это? Я всегда хочу узнать причину, по которой вместо того, чтобы знать, что существует работа – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^