Как переопределить глобальный стиль (у которого нет x: Key) или, альтернативно, применить именованный стиль ко всем элементам управления, ориентированным на тип?
-
19-09-2019 - |
Вопрос
Я объявил стиль, который я хочу применить ко ВСЕМ кнопкам в проекте, стиль находится в 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}"/
Но я ищу вещи получше, чем тупо переопределять все стили.
Решение
Попробуй это:
<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 с примененным к нему вашим "глобальным" стилем, то в любом месте, где вы бы использовали этот элемент управления, вы могли бы просто добавить любой 'Новое стили или переопределять стили, если / когда они были необходимы.
Если вы еще не создали пользовательский элемент управления, их легко реализовать.