Style.TargetType Propiedad

Definición

Obtiene o establece el tipo para el que está previsto el estilo. TargetType se puede usar para declarar un recurso de estilo implícito si no hay ninguna clave de recurso especificada.

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"/>

Valor de propiedad

Tipo de objeto al que se aplica el estilo. Este valor normalmente se establece en XAML, no en código. Vea la sección Comentarios.

Ejemplos

En este ejemplo se crean dos estilos: uno para un TextBlock y otro para un TextBox. Cada estilo se aplica a dos instancias de un control para crear una apariencia uniforme para cada TextBlock y TextBox. En el ejemplo se establece la propiedad FrameworkElement.Style de cada control haciendo referencia al estilo como una extensión de marcado {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>

Comentarios

Se requiere un TargetType valor para todos los casos en los que se usa o declara un style. No existe ningún valor predeterminado. Incluso un Style objeto que se usa como un valor insertado de la propiedad FrameworkElement.Style requiere un valor explícito TargetType .

La manera típica de especificar un TargetType valor es a través de un atributo XAML en el elemento Style . Cuando se establece en XAML, el significado de TargetType y los valores que proporciona se toman en cuenta algunos aspectos de cómo se representan los tipos en XAML.

Para XAML, los prefijos que serían necesarios para hacer referencia a un tipo a través de un uso de elementos XAML deben incluirse en el valor del TargetType atributo. Por ejemplo, si un estilo tiene como destino un tipo personalizado, que se define en un espacio de nombres de código asignado al prefijo "local:", el TargetType valor de atributo del estilo de ese tipo debe incluir ese mismo prefijo que precede al nombre de tipo. Este comportamiento está habilitado por el comportamiento de conversión de tipo de cadena integrado en el analizador XAML de Windows Runtime.

Al definir estilos para tipos personalizados, una vez que haya incluido un prefijo de asignación para un TargetType no incluya ningún prefijo en el valor property de ningún establecedor dentro de ese estilo.

El valor que proporcione para TargetType modifica el comportamiento de búsqueda de cualquier valor Setter.Property que especifique dentro del estilo. En concreto, se espera que las propiedades de dependencia a las que haga referencia por nombre para un Setter.Property valor de atributo XAML existan en el TargetType tipo o en cualquier clase antecesora. Por ejemplo, si el TargetType especificado es Button y uno de los Setter.Property valores de atributo XAML en style es "Background", que se resuelve en la propiedad Control.Background (Control es de tres niveles por encima de Button en su herencia de clases y Button hereda todas las propiedades de Control). Es habitual especificar el TargetType valor para que sea el mismo nombre de elemento de interfaz de usuario que usaría en el marcado típico de la interfaz de usuario, no normalmente asignaría un nombre a una clase antecesora (aunque técnicamente se permite).

Si style incluye un establecedor que declara una plantilla de control (un valor para la propiedad Template ), el TargetType valor del style primario debe coincidir con el valor TargetType del elemento ControlTemplate contenido.

Estilos implícitos

Los estilos casi siempre se declaran como recursos XAML que se comparten y se aplican a cada elemento de interfaz de usuario de la aplicación que hace referencia a ese estilo. Para declararse como un recurso, todos los elementos XAML, incluidos los elementos Style , deben tener una clave dentro de la colección resources que distinga cada recurso para la búsqueda en tiempo de ejecución. El elemento Style (y también los distintos elementos de plantilla como ControlTemplate) admiten una característica denominada estilos implícitos. Para un estilo implícito, el valor que proporcione para el TargetType valor también actúa como clave para ese estilo en su ámbito de colección de recursos y no es necesario especificar el valor del atributo x:Key . (En cambio, la mayoría de los demás elementos que declara dentro de una colección de recursos necesitan un valor de atributo x:Key explícito y obtendrá errores en tiempo de diseño o analizador que exigen esto).

A continuación, se usa un estilo declarado mediante el estilo implícito como valor style para cualquier instancia de elemento de interfaz de usuario que sea específicamente del tipo que coincida con el TargetType del estilo implícito. Los controles no necesitan hacer referencia a un estilo con un valor de atributo Style y una referencia de extensión de marcado {StaticResource} a una clave para obtener este comportamiento, es un comportamiento implícito si esos controles coinciden con el tipo de estilo implícito existente.

Los estilos implícitos no se aplican a los elementos que son subtipos del tipo al que se hace referencia como valor TargetType . Por ejemplo, si declaras un estilo implícito para los controles ToggleButton y la aplicación tiene controles CheckBox (CheckBox se deriva de ToggleButton), el estilo se aplica específicamente a ToggleButton los controles, pero no a CheckBox los controles.

El Windows Runtime define los estilos implícitos predeterminados para cada elemento práctico de la interfaz de usuario que forme parte de la API de Windows Runtime. Tiene que hacerlo porque estos estilos definen los objetos visuales para los elementos (especialmente las plantillas) y un elemento sin objetos visuales ni siquiera aparecerá en la interfaz de usuario ni participará en el diseño. Todos estos estilos implícitos se pueden ver en el archivo XAML del asistente de diseño denominado generic.xaml. Las herramientas que usas para editar XAML pueden copiar partes discretas de este archivo en el XAML de la aplicación como punto de partida al editar copias de estilos como habilitadas por las herramientas. Dentro de los estilos implícitos predeterminados, hay muchas capas de referencia de recursos, así como compatibilidad con temas mediante la extensión de marcado {ThemeResource} y pinceles específicos del tema u otros recursos. Puede invalidar cualquier estilo implícito que de otro modo provendría de la Windows Runtime define los estilos implícitos predeterminados. Para obtener más información, consulta Estilos XAML y plantillas de control XAML.

Uso de TargetType en el código

La configuración TargetType en el código es poco frecuente. El sistema de estilo XAML está pensado para usarse cargando XAML como recurso y haciendo que todos los aspectos de un estilo estén listos de antemano. Debe haber muy pocos escenarios en los que no conozca información sobre cómo aplicar un estilo a un control o aplicar un estilo hasta el tiempo de ejecución, donde habría que establecer un TargetType en un estilo creado o al que se hace referencia en el código.

La obtención de un elemento TargetType en el código también es poco común, pero quizás haya algunos escenarios más en los que podría estar haciendo esto. Por ejemplo, podría haber un conjunto de recursos de estilo con nombre ya definidos en el XAML. Pero es posible que quiera comprobar de nuevo que un estilo al que está a punto de aplicarse a un control tiene un TargetType valor que funciona para el tipo del control al que está aplicando. Por lo tanto, es posible que tenga código similar al siguiente:

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;
}

Sugerencia

Si está programando con C#, el tipo TypeName se proyecta como System.Type. Al programar con C#, normalmente se usa el typeof operador para obtener referencias al System.Type de un tipo en función de un nombre de tipo como una cadena.

Notas de migración

  • Si has usado XAML para Windows Presentation Foundation (WPF), es posible que hayas usado una extensión de marcado x:Type para rellenar los valores XAML que toman system.Type. El analizador XAML de Windows Runtime no admite x:Type. En su lugar, debes hacer referencia al tipo por nombre sin usar ninguna extensión de marcado, y la conversión de tipos xaml a respaldo necesaria ya se controla mediante el comportamiento de conversión integrado en el analizador XAML.

Se aplica a