Подтвердить что ты не робот

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

Я объявил стиль, который я хочу применить ко всем кнопкам в проекте, стиль находится в 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" />

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

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

  • Имейте глобальный стиль с ключом, который автоматически применяется ко всем целевым элементам управления во всем приложении.
  • Способ ссылки на неназванный стиль 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}"/

Но я ищу лучшего материала, чем тупо переодетые все стили.

4b9b3361

Ответ 1

Попробуйте следующее:

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

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

Ответ 2

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

<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 в вашем приложении без упоминания ключа.

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

Ответ 3

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

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