Поиск…


замечания

Вводные замечания

В WPF стиль определяет значения одного или нескольких свойств зависимостей для данного визуального элемента. Стили используются во всем приложении, чтобы сделать пользовательский интерфейс более согласованным (например, чтобы все диалоговые кнопки были согласованного размера) и облегчить массовые изменения (например, изменение ширины всех кнопок).

Стили обычно определяются в ResourceDictionary на высоком уровне в приложении (например, в App.xaml или в теме), поэтому он доступен для приложения, но они также могут быть определены для одного элемента и его дочерних элементов, например, для применения стиль для всех элементов TextBlock внутри StackPanel .

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="5,5,5,0"/>
            <Setter Property="Background" Value="#FFF0F0F0"/>
            <Setter Property="Padding" Value="5"/>
        </Style>
    </StackPanel.Resources>
        
    <TextBlock Text="First Child"/>
    <TextBlock Text="Second Child"/>
    <TextBlock Text="Third Child"/>      
</StackPanel>

Важные заметки

  • Место, где определяется стиль, влияет на его доступность.
  • Прямые ссылки не могут быть решены с помощью StaticResource . Другими словами, если вы определяете стиль, который зависит от другого стиля или ресурса в ресурсном словаре, он должен быть определен после / ниже ресурса, от которого он зависит.
  • StaticResource - это рекомендуемый способ ссылки на стили и другие ресурсы (по производительности и поведенческим причинам), если только вам не требуется использование DynamicResource , например, для тем, которые можно изменить во время выполнения.

Ресурсы

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

Определение названного стиля

Именованный стиль требует наличия свойства x:Key и применяется только к элементам, которые явно ссылаются на него по имени:

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="MyTextBlockStyle" TargetType="TextBlock">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </StackPanel.Resources>
        
    <TextBlock Text="Yellow and bold!" Style="{StaticResource MyTextBlockStyle}" />
    <TextBlock Text="Also yellow and bold!" Style="{DynamicResource MyTextBlockStyle}" />
    <TextBlock Text="Plain text." />      
</StackPanel>

Определение неявного стиля

Неявный стиль применяется ко всем элементам данного типа в пределах области видимости. Неявный стиль может опустить x:Key поскольку он неявно совпадает с свойством TargetType стиля.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </StackPanel.Resources>

    <TextBlock Text="Yellow and bold!"  />
    <TextBlock Text="Also yellow and bold!" />
    <TextBlock Style="{x:Null}" Text="I'm not yellow or bold; I'm the control's default style!" />
</StackPanel>

Наследование от стиля

Обычно требуется базовый стиль, который определяет свойства / значения, разделяемые между несколькими стилями, принадлежащими одному и тому же TextBlock управления, особенно для чего-то вроде TextBlock . Это достигается с помощью свойства BasedOn . Значения наследуются, а затем могут быть переопределены.

<Style x:Key="BaseTextBlockStyle" TargetType="TextBlock">
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Foreground" Value="#FFBBBBBB" />
    <Setter Property="FontFamily" Value="Arial" />
</Style>

<Style x:Key="WarningTextBlockStyle"
       TargetType="TextBlock"
       BasedOn="{StaticResource BaseTextBlockStyle">
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold" />
</Style>

В приведенном выше примере любой TextBlock с использованием стиля WarningTextBlockStyle будет представлен как 12px Arial в красном и полужирном.

Поскольку неявные стили имеют неявный x:Key , соответствующий их TargetType , вы также можете наследовать их:

<!-- Implicit -->
<Style TargetType="TextBlock">
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Foreground" Value="#FFBBBBBB" />
    <Setter Property="FontFamily" Value="Arial" />
</Style>

<Style x:Key="WarningTextBlockStyle"
       TargetType="TextBlock"
       BasedOn="{StaticResource {x:Type TextBlock}}">
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold" />
</Style>


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow