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>
- Наследование
- Атрибуты
Примеры
В этом примере создаются два стиля: для 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,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 |
Всегда возвращает в |
DispatcherQueue |
Возвращает объект , |
IsSealed |
Возвращает значение, указывающее, доступен ли стиль только для чтения. |
Setters |
Возвращает коллекцию объектов Setter . |
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) |