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 является обязательным для всех случаев, когда используется или объявляется стиль. Значение по умолчанию отсутствует. Даже стиль , используемый в качестве встроенного значения свойства 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 определяет неявные стили по умолчанию. Дополнительные сведения см. в разделах Краткое руководство. Стилизация элементов управления и Краткое руководство. Шаблоны элементов управления.

Использование 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;
}

Совет

При программировании на языке Microsoft .NET (C# или Microsoft Visual Basic) тип TypeName проектируются как System.Type. При программировании на C#C# оператор typeof обычно используется для получения ссылок на System.Type типа на основе имени типа в виде строки. В Microsoft Visual Basic используйте GetType.

Примечания о переходе

  • Если вы использовали XAML для Windows Presentation Foundation (WPF), возможно, вы использовали расширение разметки x:Type для заполнения любых значений XAML, которые принимают System.Type. Средство синтаксического анализа XAML среда выполнения Windows не поддерживает x:Type. Вместо этого следует ссылаться на тип по имени без использования расширения разметки, а любое необходимое преобразование типа XAML в резервный уже обрабатывается встроенным поведением преобразования в средстве синтаксического анализа XAML.

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