Как переопределить глобальный стиль (у которого нет x: Key) или, в качестве альтернативы, применить именованный стиль ко всем элементам управления, ориентированным на тип? - PullRequest
42 голосов
/ 20 августа 2009

Я объявил стиль, который хочу применить ко ВСЕМ кнопкам в проекте, стиль находится в ResourceDictionary:

<Style TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

Теперь в каком-то окне я хочу наследовать от этого стиля, но добавить значение:

<Style TargetType="StackPanel"> 
    <Setter Property="Margin" Value="5"/>
</Style>

Проблема в том, что он не наследуется от глобального стиля, чтобы наследовать, я должен назначить ключ к глобальному стилю:

<Style TargetType="StackPanel" x:Key="StackPanelStyle" />

А затем в наследовании XAML окна (или / и переопределении - необязательно) это:

<Style TargetType="StackPanel" BasedOn="StackPanelStyle" />

Проблема в том, что если вы назначаете ключ, он не является глобальным, и вы должны вызывать его в каждом окне / области.

Решение моего вопроса должно быть одним из двух (есть что-то еще, что я пропускаю?):

  1. Иметь глобальный стиль с ключом, который автоматически применяется ко всем целевым элементам управления во всем приложении.
  2. Способ обращения к безымянному стилю на уровне ResourceDictionary без его переопределения.

Я думал о повторном выделении стилей рядом с именованными стилями (в ResourceDictionary), которое на самом деле работает:

<!--In the ResourceDictionary-->
<Style x:Key="StackPanelStyle" TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
<!--In the app.xaml-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/>
<!--In the window/page scope-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/

Но я ищу вещи получше, чем тупо перекраивать все стили.

Ответы [ 3 ]

65 голосов
/ 20 августа 2009

Попробуйте это:

<Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}">
  <!-- ... -->
</Style>

Я объявил свои базовые стили в ResourceDictionary в App.xaml, если я переопределяю их в определенном окне, как это, обычно это работает.

1 голос
/ 13 мая 2015

Где-то в глобальном словаре ресурсов вы определяете базовый стиль с помощью ключа. Этот базовый стиль предназначен для типа, который является базовым для всех типов, для которых вы собираетесь применять этот стиль. Затем вы определяете стили, нацеленные на нужные вам типы, и основаны на вышеупомянутом базовом стиле.

<Style
    x:Key="upDownBaseStyle"
    TargetType="{x:Type Control}">
    <Setter
      Property="Margin"
      Value="2" />
    <Setter
      Property="HorizontalAlignment"
      Value="Stretch" />
    <Setter
      Property="VerticalAlignment"
      Value="Center" />
  </Style>

  <Style
    TargetType="{x:Type xceed:IntegerUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

  <Style
    TargetType="{x:Type xceed:DoubleUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

Теперь два последних стиля применяются ко всем элементам управления IntegerUpDown и DoubleUpDown в вашем приложении без указания ключа.

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

0 голосов
/ 20 августа 2009

Я хотел бы предположить, что то, что вы, возможно, ищете здесь, это основной стиль или сценарий поведения, который обычно достигается путем создания пользовательского элемента управления. Если бы вы создали новый элемент управления кнопками с примененным к нему «глобальным» стилем, то в любом месте, где бы вы ни использовали этот элемент управления, вы можете просто добавить любые « новые » стили или переопределить стили, если / когда они были необходимы.

Если вы не создали пользовательский элемент управления, его легко реализовать.

...