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 se establece normalmente 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 a la extensión de marcado Style como {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 valor TargetType para todos los casos en los que use o declare un style. No existe ningún valor predeterminado. Incluso un estilo que se usa como un valor insertado de la propiedad FrameworkElement.Style requiere un valor TargetType explícito.

La manera típica de especificar un valor TargetType 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 proporcionas toman en cuenta algunos aspectos de cómo se representan los tipos en XAML.

Para XAML, los prefijos necesarios para hacer referencia a un tipo a través de un uso de elementos XAML deben incluirse en el valor del atributo TargetType. 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 valor del atributo TargetType para ese estilo debe incluir ese mismo prefijo que precede al nombre de tipo. Este comportamiento se habilita mediante 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 valor de atributo XAML Setter.Property existan en el tipo TargetType o en cualquier clase antecesora. Por ejemplo, si targetType que especificas es Button y uno de los valores de atributo XAML Setter.Property en Style es "Background", que se resuelve en la propiedad Control.Background (Control es de tres niveles encima de Button en su herencia de clases y Button hereda todas las propiedades de Control). Es habitual especificar el valor TargetType 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 suele asignar 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 valor TargetType del estilo 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 de recursos que distingue 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 valor TargetType 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ía errores en tiempo de diseño o analizador que exigen esto).

A continuación, se usa un estilo que se declara 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 un 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 el valor TargetType. Por ejemplo, si declara un estilo implícito para los controles ToggleButton y la aplicación tiene controles CheckBox (CheckBox deriva de ToggleButton), el estilo se aplica específicamente a los controles ToggleButton , pero no a los controles CheckBox .

El Windows Runtime define los estilos implícitos predeterminados para cada elemento práctico de la interfaz de usuario que forma 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 lo contrario, provendría del Windows Runtime define los estilos implícitos predeterminados. Para obtener más información, consulte Inicio rápido: Controles de estilo e Inicio rápido: Plantillas de control.

Uso de TargetType en el código

Establecer TargetType en el código es poco frecuente. El sistema de estilo XAML está pensado para usarse cargando XAML como un recurso y haciendo que todos los aspectos de un estilo estén listos de antemano. Debe haber muy pocos escenarios en los que no sepa 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 TargetType en el código también es poco común, pero quizás haya algunos escenarios más en los que pueda hacerlo. Por ejemplo, podría haber un conjunto de recursos de estilo con nombre ya definidos en el XAML. Pero es posible que quiera comprobar que un estilo al que va a aplicar un control tiene un valor TargetType 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 va a programar con un lenguaje Microsoft .NET (C# o Microsoft Visual Basic), typeName escribe proyectos como System.Type. Al programar con C#C#, normalmente se usa el operador typeof para obtener referencias al system.Type de un tipo basado en un nombre de tipo como una cadena. En Microsoft Visual Basic, use GetType.

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 un 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 está controlada por el comportamiento de conversión integrado en el analizador XAML.

Se aplica a