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


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

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