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

StackOverflow https://stackoverflow.com/questions/1303634

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top