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


Style Класс

Определение

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

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

Примеры

В этом примере создаются два стиля: для TextBlock и TextBox. Каждый стиль применяется к двум экземплярам элемента управления для создания единообразного внешнего вида для каждого и TextBlockTextBox. В примере задается свойство 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,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>

В этом примере создается объект Styleс именем InheritedStyle , основанный Style на с именем BaseStyle. InheritedStyle наследует Background значение Yellow из BaseStyle и добавляет Foreground значение 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 сути, представляет собой коллекцию параметров свойств, применяемых к одному или нескольким экземплярам определенного типа, которые имеют такие свойства. Содержит Style коллекцию из одного или нескольких объектов Setter . У каждого из них Setter есть свойство и значение. — Property это имя свойства элемента, к который применяется стиль. — Value это значение, применяемое к свойству .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Стили BasedOn

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

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

Стили можно определить таким образом, чтобы Style неявно использовался всеми объектами одного 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()

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

Style(TypeName)

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

Свойства

BasedOn

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

Dispatcher

Всегда возвращает в null приложении Windows App SDK. Вместо этого используйте DispatcherQueue .

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

Возвращает объект , DispatcherQueue с которым связан этот объект. представляет DispatcherQueue средство, которое может получить доступ к в потоке 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)

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

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