Style Clase

Definición

Contiene establecedores de propiedades que se pueden compartir entre instancias de un tipo. Normalmente Style se declara en una colección de recursos para que se pueda compartir y usar para aplicar plantillas de control y otros estilos.

public ref class Style sealed : DependencyObject
/// [Microsoft.UI.Xaml.Markup.ContentProperty(Name="Setters")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
/// [Windows.Foundation.Metadata.Activatable(Microsoft.UI.Xaml.IStyleFactory, 65536, "Microsoft.UI.Xaml.WinUIContract")]
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class Style final : DependencyObject
[Microsoft.UI.Xaml.Markup.ContentProperty(Name="Setters")]
[Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
[Windows.Foundation.Metadata.Activatable(typeof(Microsoft.UI.Xaml.IStyleFactory), 65536, "Microsoft.UI.Xaml.WinUIContract")]
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class Style : DependencyObject
Public NotInheritable Class Style
Inherits DependencyObject
<Style .../>
-or-
<Style ...>
  oneOrMoreSetters
</Style>
Herencia
Object Platform::Object IInspectable DependencyObject Style
Atributos

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 Styleextensión de marcado {StaticResource}. En el ejemplo también se muestra cómo recuperar un estilo de un diccionario de recursos y aplicarlo a un control en el código.

Cada estilo tiene varias partes establecedores . En este XAML, no aparece ningún Style.Setters elemento de propiedad XAML. Ese es el uso típico en XAML para esta propiedad. El Style.Setters valor es implícito, porque Setters es la propiedad de contenido XAML para un style. Para obtener más información sobre la sintaxis XAML y cómo la sintaxis de contenido XAML permite implicar y omitir determinados elementos XAML, consulta La guía de sintaxis XAML.

Observe que en el estilo del TextBox, la propiedad Margin se establece en 4, lo que significa que TextBox tiene un margen de 4 en todos los lados. Para compensar la longitud del segundo TextBlock, que es más corto que el primero TextBlock porque apellidos toma menos espacio que nombre, se asigna un valor de "6,4,4,4" a la Margin propiedad en el segundo TextBox. Esto hace que el segundo TextBox tenga un margen diferente al especificado por el estilo, de modo que se alinee horizontalmente con el primer TextBox.

<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>
private void ShowEmailAddressBox()
{
    TextBlock emailAddressLabel = new TextBlock();
    emailAddressLabel.Text = "Email:";
    emailAddressLabel.Style = (Style)rootPanel.Resources["TextBlockStyle"];

    TextBox emailAddressBox = new TextBox();
    emailAddressBox.Style = (Style)rootPanel.Resources["TextBoxStyle"];
    emailAddressBox.Margin = new Thickness(38, 4, 4, 4);

    emailAddressPanel.Children.Add(emailAddressLabel);
    emailAddressPanel.Children.Add(emailAddressBox);
}

En este ejemplo se crean dos elementos de estilo. Para TargetType el primer elemento de estilo se establece TextBox en y el TargetType del segundo elemento de estilo se establece en Button. A continuación, se aplican como estilo implícito para un TextBox control y un Button control .

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Foreground" Value="Pink" />
            <Setter Property="FontSize" Value="15" />                
        </Style>
        
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="Background" Value="Yellow" />
        </Style>
    </StackPanel.Resources>
    
    <TextBox Height="30" Width="120" Margin="2" Text="TextBoxStyle" />
    <Button Height="30" Width="100" Margin="2" Content="ButtonStyle" />
</StackPanel>

En este ejemplo se crea un Style elemento denominado InheritedStyle basado en un Style objeto denominado BaseStyle. InheritedStyle hereda el Background valor de Yellow de BaseStyle y agrega un Foreground valor de Red.

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="BaseStyle" TargetType="Button">
            <Setter Property="Background" Value="Yellow" />
        </Style>
        <!--Create a Style based on BaseStyle-->
        <Style x:Key="InheritedStyle" TargetType="Button" BasedOn="{StaticResource BaseStyle}">
            <Setter Property="Foreground" Value="Red" />
        </Style>
    </StackPanel.Resources>
    <!--A button with default style-->
    <Button Content="HelloWorld" />
    <!--A button with base style-->
    <Button Content="HelloWorld" Style="{StaticResource BaseStyle}" />
    <!--A button with a style that is inherited from the BaseStyle-->
    <Button Content="HelloWorld" Style="{StaticResource InheritedStyle}" />
</StackPanel>

Comentarios

Es Style básicamente una colección de valores de propiedad aplicados a una o varias instancias de un tipo determinado que tiene estas propiedades. Style Contiene una colección de uno o varios objetos Setter. Cada Setter tiene una propiedad y un valor. Property es el nombre de la propiedad del elemento al que se aplica el estilo. Value es el valor que se aplica a la propiedad .

Para aplicar un Style, el objeto de destino debe ser DependencyObject. La propiedad a la que cada establecedor hace referencia como un valor Property debe ser una propiedad de dependencia.

Debe establecer la propiedad TargetType al crear un Style. De lo contrario, se produce una excepción.

Si establece un valor para la misma propiedad en Style y también en un elemento directamente, el valor establecido en el elemento tiene prioridad directamente. Para obtener más información, consulte Información general sobre las propiedades de dependencia, en concreto la sección "Precedencia del valor de la propiedad de dependencia".

Definición de un estilo como un recurso XAML

Un Style elemento casi siempre se define en XAML como un recurso en un ResourceDictionary.

  • Para un Style objeto que solo se usa en otros elementos de interfaz de usuario definidos en la misma página XAML, normalmente se define el estilo en la colección FrameworkElement.Resources (Page.Resources si el elemento raíz es una página).
  • Para un Style que usa más de una página en la aplicación, normalmente se define el estilo en la colección Application.Resources . Como alternativa, es posible que tengas un archivo XAML independiente para la aplicación que incluyas como Application.Resources un valor MergedDictionaries .
  • La mayoría de los elementos de la interfaz de usuario tienen un estilo predeterminado definido por el Windows Runtime. Las copias de los estilos predeterminados se pueden ver en el archivo XAML del asistente de diseño denominado generic.xaml, que técnicamente no es un archivo de recursos para las aplicaciones, aunque está estructurado como uno. Puedes 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, pero una vez que realices dicha copia, debe incluirse en una de las colecciones Resources o acceder indirectamente a través de MergedDictionaries. En todos estos casos, el XAML modificado que invalida el valor predeterminado se incluye como parte de la aplicación.

Un Style elemento definido en un ResourceDictionary no es necesario tener un atributo x:Key o un atributo x:Name, que normalmente es un requisito de ser un recurso XAML. Un Style objeto que se define de esta manera usa su valor de propiedad TargetType como clave implícita y se conoce como un estilo implícito.

Para obtener más información sobre cómo usar diccionarios de recursos XAML, consulta Referencias a recursos Xaml y ResourceDictionary.

Estilos y plantillas

Puede usar un establecedor en para Style aplicar valores a cualquier propiedad de dependencia. Pero es para la Setter propiedad Template de una clase derivada de Control que constituye la mayoría del marcado XAML en un típico Style. El valor de un Setter objeto with Property="Template" casi siempre se especifica como un elemento de propiedad que contiene un elemento de objeto ControlTemplate .

Cuando se usa para Style definir una plantilla de control, el TargetType del Style elemento y el TargetType del elemento ControlTemplate para su establecedor Control.Template siempre deben usar el mismo valor.

El establecedor de plantillas define la definición de interfaz de usuario de plantilla básica para una instancia de control donde se aplica esa plantilla. También contiene los estados visuales de un control y otras definiciones de interfaz de usuario basadas en estado, como transiciones de tema predeterminadas. Para un control complejo, como ListBox, el estilo de plantilla predeterminado y la propiedad ControlTemplate dentro pueden tener cientos de líneas de XAML. Para obtener más información sobre el rol de en escenarios de plantillas de Style control, consulta Plantillas de control XAML.

La plantilla de un control suele incluir estados visuales que cambian la apariencia del control en respuesta a los estados lógicos. Por ejemplo, un botón puede tener una apariencia visual diferente cuando se presiona aplicando un nuevo estado visual de su plantilla, y todos los cambios de apariencia pueden proceder del código XAML no. Para obtener más información sobre cómo funcionan los estados visuales y cómo modificarlos o definir estados para controles personalizados, consulta Plantillas de control XAML.

Estilos y comportamiento en tiempo de ejecución

Puede cambiar los valores de las propiedades individuales establecidas por en Style tiempo de ejecución y los nuevos valores sobrescriben los valores de Establecedores . Por ejemplo, puede establecer la propiedad Template en tiempo de ejecución incluso si esta propiedad se ha establecido por un estilo.

Puede ajustar las propiedades de en Style tiempo de ejecución, pero solo si ese estilo no se ha aplicado a nada y solo existe como un recurso que no se usa implícitamente. Por ejemplo, puedes agregar establecedores a la colección en Establecedores para un estilo que exista en Resources con un atributo x:Key , pero que no tenga ningún valor de extensión de marcado {StaticResource} en otra parte de XAML que haga referencia a ese estilo. Sin embargo, en cuanto se hace referencia a un estilo y se usa para los valores de un objeto cargado, Style se debe considerar sellado. Puede detectar el estado sellado comprobando el valor de la propiedad IsSealed para .Style Si es true, el estilo está sellado y no se pueden modificar las propiedades de él ni los subvalores setter dentro de . El momento en el que un estilo se ha puesto en uso y sellado también se puede detectar cuando el objeto al Style que se hace referencia genera su evento Loaded .

Estilos BasedOn

Puedes crear un nuevo estilo basado en un estilo existente definido por la aplicación o por estilos predeterminados para Windows Runtime controles. Puede hacerlo mediante la propiedad BasedOn . Esto reduce la duplicación en xaml y facilita la administración de recursos. Cada estilo solo admite un BasedOn estilo. Para obtener más información, consulta Controles BasedOn o Style.

Estilos implícitos

Puede definir estilos de forma que Style todos los objetos del mismo TargetType utilicen implícitamente un objeto de forma implícita, sin necesidad de que cada instancia de un objeto de este tipo haga referencia específicamente al valor Style como un valor FrameworkElement.Style . Cuando un <Style> recurso se declara en un ResourceDictionary sin un atributo x:Key, el valor x:Key usa el valor de la TargetType propiedad . Si establece el estilo implícitamente, el estilo solo se aplica a los tipos que coinciden TargetType exactamente y no a los elementos derivados del TargetType valor. Por ejemplo, si crea un estilo implícitamente para todos los controles ToggleButton de la aplicación, y la aplicación tiene ToggleButton y controles CheckBox (CheckBox deriva de ToggleButton), el estilo implícito "ToggleButton" solo se aplica a los ToggleButton controles.

Notas sobre la sintaxis XAML

Establecedores es la propiedad de contenido XAML para Style, por lo que puedes usar una sintaxis de colección implícita como <Style><Setter .../><Setter .../></Style>.

El uso de la clase en el Style código (por ejemplo, llamar a un constructor y crear los valores de Establecedor uno por uno) es muy poco frecuente. Los estilos se usan para las plantillas y las plantillas deben estar disponibles en tiempo de carga XAML, por lo que cualquier Style creado en el código suele estar disponible demasiado tarde para aplicarse a los controles de una interfaz de usuario.

Constructores

Style()

Inicializa una nueva instancia de la clase Style , sin targetType inicial y una colección Setters vacía.

Style(TypeName)

Inicializa una nueva instancia de la clase Style , con un TargetType inicial especificado y una colección Setters vacía.

Propiedades

BasedOn

Obtiene o establece un estilo definido que es la base del estilo actual.

Dispatcher

Siempre devuelve null en una aplicación de SDK de Aplicaciones para Windows. Use DispatcherQueue en su lugar.

(Heredado de DependencyObject)
DispatcherQueue

Obtiene el objeto DispatcherQueue al que está asociado este objeto. DispatcherQueue representa una instalación que puede acceder al DependencyObject en el subproceso de interfaz de usuario incluso si un subproceso que no es de interfaz de usuario inicia el código.

(Heredado de DependencyObject)
IsSealed

Obtiene un valor que indica si el estilo es de solo lectura y no se puede cambiar.

Setters

Obtiene una colección de objetos Setter .

TargetType

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.

Métodos

ClearValue(DependencyProperty)

Borra el valor local de una propiedad de dependencia.

(Heredado de DependencyObject)
GetAnimationBaseValue(DependencyProperty)

Devuelve cualquier valor base establecido para una propiedad de dependencia, que se aplicaría en los casos en los que una animación no está activa.

(Heredado de DependencyObject)
GetValue(DependencyProperty)

Devuelve el valor efectivo actual de una propiedad de dependencia de dependencyObject.

(Heredado de DependencyObject)
ReadLocalValue(DependencyProperty)

Devuelve el valor local de una propiedad de dependencia, si se establece un valor local.

(Heredado de DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Registra una función de notificación para escuchar los cambios en una dependencyProperty específica en esta instancia de DependencyObject .

(Heredado de DependencyObject)
Seal()

Bloquea el estilo para que no se pueda cambiar la propiedad TargetType o cualquier Establecedor de la colección Setters .

SetValue(DependencyProperty, Object)

Establece el valor local de una propiedad de dependencia en dependencyObject.

(Heredado de DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Cancela una notificación de cambio registrada anteriormente llamando a RegisterPropertyChangedCallback.

(Heredado de DependencyObject)

Se aplica a

Consulte también