2014-10-16 9 views
1

Если существует несколько стилей, как это:Несколько стилей на тот же целевой тип

<Style TargetType="{x:Type local:MyControl}"> 
... 

, которые объединены в из словарей ресурсов, которые нацелены на один и тот же тип управления, который должен иметь приоритет, он столкнулся с первым стиль или последний?

Где я могу найти правила, которые управляют такими вещами?

+2

Вы не можете объединить их в один словарь, потому что у них одинаковый ключ. –

+0

@ Гамлет, даже если я не x: назовите стили? – Chanakya

+1

@Chanakya: Элементы в ResourceDictionaries имеют ключи, а не имена. Прочтите мой ответ ниже, он объясняет, почему это невозможно. (Существует неявный ключ). И если вы думаете об этом, как .NET должен знать, какой из двух стилей использовать? Представьте, что они идентичны, за исключением красного цвета, а другого - синего. –

ответ

4

Стили применяются из ResourceDictionary, ближайшего к соответствующему элементу управления. Пример:

<Window> 
    <Window.Resource> 
     <Style 1/> 
    <Window.Resources> 
    <Grid> 
     <Grid.Resources> 
      <Style 2/> 
     </Grid.Resources> 
     <TextBox/> 
    </Grid> 
</Window> 

В приведенном выше примере стиль 2 будет применен к TextBox. Если вы хотите каскадировать стили (примените оба стиля к TextBox), вы можете установить BasedOn на Style2, чтобы указать на Style1, используя BasedOn="{StaticResource {x:Type TextBox}}". Пожалуйста, проверьте синтаксис, у меня здесь нет VS.

Как вы можете видеть, тип становится Key. Так как недопустимо иметь два элемента с одним и тем же ключом в одном ResourceDictionary, вы не можете объединить два ResourceDictionaries с перекрывающимися стилями. Должно быть возможно спроектировать вокруг такого требования, помня, что ResourceDictionary может ссылаться на другое использование. Опять же, вы используете BasedOn.

+0

Спасибо, это отвечает на мой исходный пункт о правилах, и хотя я не могу согласиться с обоими ответами, ответ Гамлета помог понять, когда в одном и том же ресурсном словаре и о ключах. – Chanakya

+0

Синтаксис проверяется. Я не понимал, что вы можете использовать BasedOn, не ссылаясь на стиль по ключу. Очень полезно. – AndrewS

2

Это ответ на ваш комментарий и на вопрос. Name, x:Name не играет на месте в этом случае. Каждый ресурс в словаре должен иметь Key. Для целевых стилей инфраструктура WPF генерирует Key, поэтому стили с одним и тем же типом целевого типа будут иметь один и тот же ключ, поэтому вы не можете использовать более одного целевого стиля для каждого типа словаря.

0

Будет выдано исключение. Это то, что я пытался проверить это:

Я написал простой ResourceDictionary с 2-мя стилями, с таким же TargetType но без x:Key (не x:Name).

<Style TargetType="TextBox"> 
    <Setter Property="Height" Value="100"/> 
</Style> 

<Style TargetType="TextBox"> 
    <Setter Property="Height" Value="200"/> 
</Style> 

Восстановленный проект, и он успешно выполнил. Теперь, что будет применяться?

Ну, когда я его запустил, он исключил большое значение при загрузке стилей. Короче говоря, это не сработает.

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