Style.TargetType Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает или задает тип, для которого предназначен стиль.
TargetType
можно использовать для объявления ресурса неявного стиля, если ключ ресурса не указан.
public:
property TypeName TargetType { TypeName get(); void set(TypeName value); };
TypeName TargetType();
void TargetType(TypeName value);
public System.Type TargetType { get; set; }
var typeName = style.targetType;
style.targetType = typeName;
Public Property TargetType As Type
<Style TargetType="typeName"/>
Значение свойства
Тип объекта, к которому применяется стиль. Это значение обычно устанавливается в XAML, а не в коде. См. заметки.
Примеры
В этом примере создаются два стиля: для TextBlock и TextBox. Каждый стиль применяется к двум экземплярам элемента управления для создания единообразного внешнего вида для каждого и TextBlock
TextBox
. В примере задается свойство FrameworkElement.Style каждого элемента управления, ссылаясь на Style как на расширение разметки {StaticResource}.
<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>
Комментарии
Значение TargetType
является обязательным для всех случаев, когда используется или объявляется стиль. Значение по умолчанию отсутствует. Даже объект , используемый Style
в качестве встроенного значения свойства FrameworkElement.Style , требует явного TargetType
значения.
Обычно значение можно указать TargetType
с помощью атрибута XAML в элементе Style . Если задано в XAML, значение TargetType
и предоставляемые значения принимают на себя некоторые аспекты представления типов в XAML.
Для XAML все префиксы, необходимые для ссылки на тип через использование элемента XAML, должны быть включены в значение атрибута TargetType
. Например, если стиль предназначен для пользовательского типа, определенного в пространстве имен кода, сопоставленном с префиксом local:, то TargetType
значение атрибута для стиля этого типа должно содержать тот же префикс перед именем типа. Это поведение поддерживается встроенным поведением преобразования строкового типа в средстве синтаксического анализа XAML среда выполнения Windows.
При определении стилей для пользовательских типов после включения префикса сопоставления для TargetType
не включайте префикс в значение Свойства любого метода задания в этом стиле.
Указанное значение TargetType
изменяет поведение поиска для любого значения Setter.Property , указанного в стиле. В частности, свойства зависимостей, на которые вы ссылаетесь по имени для Setter.Property
значения атрибута XAML, должны существовать в типе TargetType
или в любом классе-предках. Например, если TargetType
задано значение Button, а одно из значений Setter.Property
атрибута XAML в Style — "Background", это разрешается в свойство Control.Background (Control на три уровня выше Button в своем наследовании класса и Button
наследует все свойства Control). Обычно указать TargetType
значение, которое будет совпадать с именами элементов пользовательского интерфейса, которые вы используете в типичной разметке пользовательского интерфейса. Обычно вы не будете называть класс-предок (хотя это технически разрешено).
Если style содержит метод задания , объявляющий шаблон элемента управления (значение свойства Template ), то TargetType
значение родительского стиля должно соответствовать значению TargetType содержащегося элемента ControlTemplate .
Неявные стили
Стили почти всегда объявляются как ресурсы XAML, которые совместно используются и применяются к каждому элементу пользовательского интерфейса в приложении, который ссылается на этот стиль. Чтобы быть объявленным как ресурс, все элементы XAML, включая элементы Style , должны иметь ключ в коллекции ресурсов, который различает каждый ресурс для поиска во время выполнения. Элемент Style (а также различные элементы шаблона, такие как ControlTemplate) поддерживает функцию, называемую неявными стилями. Для неявного стиля значение, указанное TargetType
для значения, также служит ключом для этого стиля в коллекции ресурсов область, и вам не требуется указывать значение атрибута x:Key. (В отличие от этого, большинству других элементов, объявленных в коллекции ресурсов, требуется явное значение атрибута x:Key , и вы получите ошибки времени разработки или средства синтаксического анализа, которые обеспечивают это.)
Стиль, объявленный с использованием неявного стиля, затем используется в качестве значения Style для любого экземпляра элемента пользовательского интерфейса, который имеет тип, соответствующий TargetType
неявному стилю. Для получения этого поведения элементам управления не нужно ссылаться на стиль со значением атрибута Style и ссылкой на расширение разметки {StaticResource} на ключ. Это неявное поведение, если эти элементы управления соответствуют типу существующего неявного стиля.
Неявные стили не применяются к элементам, которые являются подтипами типа, на который ссылается TargetType
значение. Например, если вы объявляете неявный стиль для элементов управления ToggleButton и в приложении есть элементы управления CheckBox (CheckBox
производные от ToggleButton
), стиль применяется только к ToggleButton
элементам управления, но не к CheckBox
элементам управления.
Среда выполнения Windows определяет неявные стили по умолчанию для каждого практического элемента пользовательского интерфейса, который является частью API среда выполнения Windows. Это необходимо сделать, так как эти стили определяют визуальные элементы для элементов (особенно шаблонов), а элемент без визуальных элементов даже не будет отображаться в пользовательском интерфейсе или участвовать в макете. Все эти неявные стили можно увидеть в файле XAML вспомогательного средства разработки с именем generic.xaml. Средства, используемые для редактирования XAML, могут копировать отдельные части этого файла в XAML приложения в качестве отправной точки при редактировании копий стилей, включенных инструментами. В неявных стилях по умолчанию существует множество уровней ссылок на ресурсы, а также поддержка темы с помощью расширения разметки {ThemeResource} и кистей для конкретной темы или других ресурсов. Вы можете переопределить любой неявный стиль, который в противном случае был бы получен из среда выполнения Windows определяет неявные стили по умолчанию. Дополнительные сведения см. в разделах Стили XAML и Шаблоны элементов управления XAML.
Использование TargetType в коде
Настройка TargetType
в коде встречается редко. Система стилей XAML предназначена для использования путем загрузки XAML в качестве ресурса и предварительной подготовки всех аспектов стиля. Существует очень мало сценариев, в которых вы не будете знать сведения о стиле элемента управления или применении стиля до среды выполнения, где необходимо задать TargetType для стиля , созданного или упоминаемого в коде.
Получение в коде TargetType
также является редким явлением, но есть еще несколько сценариев, в которых это можно сделать. Например, может существовать набор именованных ресурсов Style , уже определенных в XAML. Но вы можете дважды проверка, что стиль, который вы собираетесь применить к элементу TargetType
управления, имеет значение, которое подходит для типа элемента управления, к которому вы его применяете. Таким образом, у вас может быть такой код:
private bool VerifyStyle(FrameworkElement scope, String styleKey, Control applyTo)
{
Style styleToCheck = scope.Resources[styleKey] as Style;
if (styleToCheck != null)
{
if (styleToCheck.TargetType == applyTo.GetType())
{
// applyTo.Style = styleToCheck;
return true;
}
}
return false;
}
Совет
При программировании на C#, тип TypeName проектируются как System.Type. При программировании на C# оператор обычно используется typeof
для получения ссылок на System.Type
тип на основе имени типа в виде строки.
Примечания о переходе
- Если вы использовали XAML для Windows Presentation Foundation (WPF), возможно, вы использовали расширение разметки x:Type для заполнения любых значений XAML, которые принимают System.Type. Средство синтаксического анализа XAML среда выполнения Windows не поддерживает x:Type. Вместо этого следует ссылаться на тип по имени без использования расширения разметки, а любое необходимое преобразование типа XAML в резервные уже обрабатывается встроенным поведением преобразования в средстве синтаксического анализа XAML.