Поделиться через


Style Класс

Определение

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

public ref class Style sealed : DependencyObject
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
class Style final : DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, "Windows.Foundation.UniversalApiContract")]
class Style final : DependencyObject
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
public sealed class Style : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, "Windows.Foundation.UniversalApiContract")]
public sealed class Style : DependencyObject
Public NotInheritable Class Style
Inherits DependencyObject
<Style .../>
-or-
<Style ...>
  oneOrMoreSetters
</Style>
Наследование
Object Platform::Object IInspectable DependencyObject Style
Атрибуты

Требования к Windows

Семейство устройств
Windows 10 (появилось в 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (появилось в v1.0)

Примеры

В этом примере создаются два стиля: для TextBlock и TextBox. Каждый стиль применяется к двум экземплярам элемента управления для создания единообразного внешнего вида для каждого элемента управления TextBlock и TextBox. В примере задается свойство FrameworkElement.Style каждого элемента управления, ссылаясь на Style как на расширение разметки {StaticResource}. В примере также показано, как получить стиль из словаря ресурсов и применить его к элементу управления в коде.

Каждый стиль состоит из нескольких частей setter . В этом XAML элемент свойства XAML не Style.Setters отображается. Это типичное использование этого свойства в XAML. Значение Style.Setters является неявным, так как setters является свойством содержимого XAML для стиля. Дополнительные сведения о синтаксисе XAML и о том, как синтаксис содержимого XAML позволяет подразумевать и опускать определенные элементы XAML, см. в руководстве по синтаксису XAML.

Обратите внимание, что в стиле textBox свойству Margin присвоено значение 4, что означает, что поле TextBox со всех сторон равно 4. Чтобы компенсировать длину второго TextBlock, который короче первого TextBlock , так как last Name занимает меньше места, чем First Name, присваивается свойству Margin второго Элемента TextBox значение "6,4,4". Это приводит к тому, что второе поле TextBox будет иметь другое поле, отличное от указанного в стиле, поэтому оно выравнивается по горизонтали с первым элементом TextBox.

<StackPanel x:Name="rootPanel">
  <StackPanel.Resources>
    <!--Create a Style for a TextBlock to specify that the
              Foreground equals Navy, FontSize equals 14, and
              VerticalAlignment equals Botton.-->
    <Style TargetType="TextBlock" x:Key="TextBlockStyle">
      <Setter Property="Foreground" Value="Navy"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="VerticalAlignment" Value="Bottom"/>
    </Style>

    <!--Create a Style for a TextBox that specifies that
              the Width is 200, Height is 30, Margin is 4,
              Background is LightBlue, and FontSize is 14.-->
    <Style TargetType="TextBox" x:Key="TextBoxStyle">
      <Setter Property="Width" Value="200"/>
      <Setter Property="Height" Value="30"/>
      <Setter Property="Margin" Value="4"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="Background">
        <Setter.Value>
          <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
            <GradientStop Color="White" Offset="0.0"/>
            <GradientStop Color="LightBlue" Offset="0.5"/>
            <GradientStop Color="Navy" Offset="1"/>
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>
    </Style>
  </StackPanel.Resources>

  <!--Apply the TextBlockStyle and TextBoxStyle to each 
      TextBlock and TextBox, respectively.-->
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="First Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"/>
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="Last Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"
             Margin="6,4,4,4"/>
  </StackPanel>
  <StackPanel x:Name="emailAddressPanel" Orientation="Horizontal"/>
</StackPanel>
private void ShowEmailAddressBox()
{
    TextBlock emailAddressLabel = new TextBlock();
    emailAddressLabel.Text = "Email:";
    emailAddressLabel.Style = (Style)rootPanel.Resources["TextBlockStyle"];

    TextBox emailAddressBox = new TextBox();
    emailAddressBox.Style = (Style)rootPanel.Resources["TextBoxStyle"];
    emailAddressBox.Margin = new Thickness(38, 4, 4, 4);

    emailAddressPanel.Children.Add(emailAddressLabel);
    emailAddressPanel.Children.Add(emailAddressBox);
}

В этом примере создаются два элемента стиля. Параметр TargetType для первого элемента стиля имеет значение TextBox, а targetType для второго элемента стиля — значение Button. Затем они применяются в качестве неявного стиля для элементов управления TextBox и Button.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Foreground" Value="Pink" />
            <Setter Property="FontSize" Value="15" />                
        </Style>
        
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="Background" Value="Yellow" />
        </Style>
    </StackPanel.Resources>
    
    <TextBox Height="30" Width="120" Margin="2" Text="TextBoxStyle" />
    <Button Height="30" Width="100" Margin="2" Content="ButtonStyle" />
</StackPanel>

В этом примере создается стиль с именем InheritedStyle, основанный на стиле BaseStyle. InheritedStyle наследует значение Background желтого от BaseStyle и добавляет значение Переднего плана red.

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="BaseStyle" TargetType="Button">
            <Setter Property="Background" Value="Yellow" />
        </Style>
        <!--Create a Style based on BaseStyle-->
        <Style x:Key="InheritedStyle" TargetType="Button" BasedOn="{StaticResource BaseStyle}">
            <Setter Property="Foreground" Value="Red" />
        </Style>
    </StackPanel.Resources>
    <!--A button with default style-->
    <Button Content="HelloWorld" />
    <!--A button with base style-->
    <Button Content="HelloWorld" Style="{StaticResource BaseStyle}" />
    <!--A button with a style that is inherited from the BaseStyle-->
    <Button Content="HelloWorld" Style="{StaticResource InheritedStyle}" />
</StackPanel>

Комментарии

Стиль — это, по сути, коллекция параметров свойств, применяемых к одному или нескольким экземплярам определенного типа, которые имеют такие свойства. Style содержит коллекцию из одного или нескольких объектов Setter . Каждый метод задания имеет свойство и значение. Свойство — это имя свойства элемента, к который применяется стиль. Значение — это значение, которое применяется к свойству .

Чтобы применить стиль, целевой объект должен быть DependencyObject. Свойство, на которое каждый метод задания ссылается как на значение Property , должно быть свойством зависимостей.

При создании стиля необходимо задать свойство TargetType . В противном случае возникает исключение.

Если задать значение для того же свойства в Style, а также непосредственно для элемента, то значение, заданное непосредственно в элементе, имеет приоритет. Дополнительные сведения см. в разделе Общие сведения о свойствах зависимостей, в частности в разделе "Приоритет значений свойств зависимостей".

Определение стиля в качестве ресурса XAML

Стиль почти всегда определяется в XAML как ресурс в ResourceDictionary.

  • Для стиля, который используется только другими элементами пользовательского интерфейса, определенными на той же странице XAML, обычно определяется style в коллекции FrameworkElement.Resources (Page.Resources если корневым элементом является Page).
  • Для стиля, используемого несколькими страницами в приложении, стиль обычно определяется в коллекции Application.Resources . Кроме того, у вас может быть отдельный XAML-файл для приложения, который вы включаете в Application.Resources в качестве значения MergedDictionaries .
  • Большинство элементов пользовательского интерфейса имеют стиль по умолчанию, определенный среда выполнения Windows. Копии стилей по умолчанию можно увидеть в файле XAML вспомогательного средства разработки с именем generic.xaml, который технически не является файлом ресурсов для приложений, хотя он структурирован как один. Вы можете скопировать отдельные части этого файла в XAML приложения в качестве отправной точки при редактировании копий стилей, включенных средствами, но после создания такой копии она должна быть включена в одну из коллекций Resources или получить косвенный доступ через MergedDictionaries. Во всех этих случаях измененный КОД XAML, который переопределяет значение по умолчанию, включается в состав приложения.

Windows 8 При повторном создании шаблонов существующего элемента управления в Windows 8 XAML вы иногда изменяете элементы Style, существующие в XAML-файле StandardStyles.xaml, который входит в большинство начальных шаблонов приложений. На файл standardStyles.xaml ссылается шаблон app.xaml как на исходный файл MergedDictionaries . Шаблоны для приложений, начиная с Windows 8.1 больше не используют StandardStyles.xaml.

Элемент, определяемый стилем, в ResourceDictionary не требуется, чтобы иметь атрибут x:Key или x:Name, что обычно является требованием быть ресурсом XAML. Стиль, определенный таким образом, использует значение свойства TargetType в качестве неявного ключа и называется неявным стилем.

Дополнительные сведения об использовании словарей ресурсов XAML см. в статье Справочники ресурсов ResourceDictionary и XAML.

Стили и шаблоны

Метод задания в стиле можно использовать для применения значений к любому свойству зависимостей. Но это метод задания для свойства Template класса, производного от Control, который составляет большую часть разметки XAML в типичном стиле. Значение для метода задания с Property="Template" почти всегда указывается как элемент свойства, содержащий элемент объекта ControlTemplate.

Если для определения шаблона элемента управления используется стиль, TargetType элемента Style и TargetType элемента ControlTemplate для метода задания Control.Template всегда должны использовать одно и то же значение.

Метод задания шаблона определяет базовое определение пользовательского интерфейса шаблона для экземпляра элемента управления, в котором применяется этот шаблон. Он также содержит визуальные состояния для элемента управления и другие определения пользовательского интерфейса на основе состояния, такие как переходы темы по умолчанию. Для сложного элемента управления, такого как ListBox, стиль шаблона по умолчанию и ControlTemplate в могут содержать сотни строк XAML. Дополнительные сведения о роли стиля в сценариях создания шаблонов элементов управления см. в разделе Шаблоны элементов управления XAML.

Шаблон для элемента управления часто включает визуальные состояния, которые изменяют внешний вид элемента управления в ответ на логические состояния. Например, кнопка может иметь другой внешний вид при нажатии путем применения нового визуального состояния из своего шаблона, а все изменения внешнего вида могут происходить из XAML, а не из кода. Дополнительные сведения о работе визуальных состояний и их изменении или определении состояний для пользовательских элементов управления см. в статье Раскадровка анимаций для визуальных состояний и шаблонов элементов управления XAML.

Стили и поведение среды выполнения

Вы можете изменить значения отдельных свойств, которые были заданы стилем во время выполнения, и новые значения перезаписывают значения Setters . Например, можно задать свойство Template во время выполнения, даже если это свойство задано стилем.

Вы можете настроить свойства стиля во время выполнения, но только в том случае, если этот стиль не был применен ни к чему и существует только как ресурс, который не используется неявно. Например, можно добавить методы задания в коллекцию в setters для стиля, который существует в Resources с атрибутом x:Key , но не имеет значения расширения разметки {StaticResource} в другом месте XAML, который ссылается на этот стиль. Однако сразу после того, как загруженный объект ссылается на Стиль и используется для значений, стиль следует считать запечатанным. Вы можете определить запечатаемое состояние, проверив значение свойства IsSealed для стиля. Если это значение true, стиль запечатан, и вы не можете изменить его свойства или подзначаемые значения setter внутри. Момент времени, когда стиль был введен в эксплуатацию и запечатан, также можно обнаружить, когда объект, на который ссылается стиль, вызывает событие Loaded .

Стили BasedOn

Вы можете создать новый стиль на основе существующего стиля, определенного приложением, или стилей по умолчанию для среда выполнения Windows элементов управления. Это можно сделать с помощью свойства BasedOn . Это сокращает дублирование в XAML и упрощает управление ресурсами. Каждый стиль поддерживает только один стиль BasedOn . Дополнительные сведения см. в разделе Элементы управления BasedOn или Стилизация.

Неявные стили

Вы можете определить стили таким образом, чтобы стиль использовался неявно всеми объектами одного TargetType, не требуя от каждого экземпляра такого объекта конкретной ссылки на Style в качестве значения FrameworkElement.Style . <Style> Если ресурс объявлен в ResourceDictionary без атрибута x:Key, значение x:Key использует значение свойства TargetType. Если задать стиль неявно, стиль применяется только к типам, точно соответствующим TargetType , а не к элементам, производным от значения TargetType . Например, если вы неявно создаете стиль для всех элементов управления ToggleButton в приложении и в приложении есть элементы управления ToggleButton и CheckBox (CheckBox является производным от ToggleButton), неявный стиль ToggleButton применяется только к элементам управления ToggleButton .

Примечания по синтаксису XAML

Методы задания — это свойство содержимого XAML для Style, поэтому можно использовать неявный синтаксис коллекции, например <Style><Setter .../><Setter .../></Style>.

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

Конструкторы

Style()

Инициализирует новый экземпляр класса Style без исходного TargetType и пустой коллекции Setters .

Style(TypeName)

Инициализирует новый экземпляр класса Style с указанным начальным TargetType и пустой коллекцией Setters .

Свойства

BasedOn

Возвращает или задает определенный стиль, являющийся основой текущего стиля.

Dispatcher

Возвращает объект CoreDispatcher , с которым связан этот объект. CoreDispatcher представляет собой средство, которое может получить доступ к DependencyObject в потоке пользовательского интерфейса, даже если код инициируется потоком, не относящегося к пользовательскому интерфейсу.

(Унаследовано от DependencyObject)
IsSealed

Возвращает значение, указывающее, доступен ли стиль только для чтения.

Setters

Возвращает коллекцию объектов Setter .

TargetType

Возвращает или задает тип, для которого предназначен стиль. TargetType можно использовать для объявления ресурса неявного стиля, если ключ ресурса не указан.

Методы

ClearValue(DependencyProperty)

Очищает локальное значение свойства зависимостей.

(Унаследовано от DependencyObject)
GetAnimationBaseValue(DependencyProperty)

Возвращает любое базовое значение, установленное для свойства зависимостей, которое применяется в случаях, когда анимация не активна.

(Унаследовано от DependencyObject)
GetValue(DependencyProperty)

Возвращает текущее действующее значение свойства зависимостей из DependencyObject.

(Унаследовано от DependencyObject)
ReadLocalValue(DependencyProperty)

Возвращает локальное значение свойства зависимостей, если задано локальное значение.

(Унаследовано от DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Регистрирует функцию уведомления для прослушивания изменений определенного DependencyProperty в этом экземпляре DependencyObject .

(Унаследовано от DependencyObject)
Seal()

Блокирует стиль, чтобы невозможно было изменить свойство TargetType или любой метод Setter в коллекции Setters .

SetValue(DependencyProperty, Object)

Задает локальное значение свойства зависимостей для Объекта DependencyObject.

(Унаследовано от DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Отменяет уведомление об изменениях, которое было ранее зарегистрировано путем вызова Метода RegisterPropertyChangedCallback.

(Унаследовано от DependencyObject)

Применяется к

См. также раздел