Compartir a través de


Style Clase

Definición

Contiene establecedores de propiedades que se pueden compartir entre instancias de un tipo. Un estilo se declara normalmente 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
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
class Style final : DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, "Windows.Foundation.UniversalApiContract")]
class Style final : DependencyObject
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
public sealed class Style : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, "Windows.Foundation.UniversalApiContract")]
public sealed class Style : DependencyObject
Public NotInheritable Class Style
Inherits DependencyObject
<Style .../>
-or-
<Style ...>
  oneOrMoreSetters
</Style>
Herencia
Object Platform::Object IInspectable DependencyObject Style
Atributos

Requisitos de Windows

Familia de dispositivos
Windows 10 (se introdujo en la versión 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (se introdujo en la versión v1.0)

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}. 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 de 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 primer TextBlock porque Last Name toma menos espacio que First Name, se asigna un valor de "6,4,4,4" a la propiedad Margin 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. TargetType para el primer elemento de estilo se establece en TextBox y targetType para el segundo elemento de estilo se establece en Button. A continuación, se aplican como estilo implícito para un control TextBox y un control Button.

<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 estilo denominado InheritedStyle basado en un estilo denominado BaseStyle. InheritedStyle hereda el valor background de Yellow de BaseStyle y agrega un valor foreground 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

Un style es básicamente una colección de valores de propiedad aplicados a una o varias instancias de un tipo determinado que tiene estas propiedades. Un style contiene una colección de uno o varios objetos Setter . Cada establecedor tiene una propiedad y un valor. La propiedad es el nombre de la propiedad del elemento al que se aplica el estilo. El valor 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 estilo. De lo contrario, se produce una excepción.

Si establece un valor para la misma propiedad en un 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 estilo casi siempre se define en XAML como un recurso en un ResourceDictionary.

  • Para un estilo que solo usan 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 estilo 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 en Application.Resources como 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.

Windows 8 Si vuelves a crear plantillas de un control existente en XAML de Windows 8, a veces modificas los elementos Style que existen en el archivo XAML StandardStyles.xaml que se incluye en la mayoría de las plantillas de aplicación iniciales. StandardStyles.xaml hace referencia a los archivos app.xaml de plantilla como un archivo de origen MergedDictionaries . Las plantillas para aplicaciones a partir de Windows 8.1 ya no usan StandardStyles.xaml.

No es necesario que un elemento definido por style en un ResourceDictionary tenga un atributo x:Key o un atributo x:Name, que normalmente es un requisito de ser un recurso XAML. Un estilo 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 un estilo para aplicar valores a cualquier propiedad de dependencia. Pero es el Establecedor de la propiedad Template de una clase derivada de Control que constituye la mayoría del marcado XAML en un estilo típico. El valor de un establecedor con Property="Template" casi siempre se especifica como un elemento de propiedad que contiene un elemento de objeto ControlTemplate .

Cuando se usa un Style para definir una plantilla de control, el TargetType del elemento Style 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 Estilo en escenarios de plantillas de 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 Animaciones con guion gráfico para estados visuales y plantillas de control XAML.

Estilos y comportamiento en tiempo de ejecución

Puede cambiar los valores de las propiedades individuales establecidas por un estilo en 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 un estilo en 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, el estilo debe considerarse 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. El momento en el que un estilo se ha puesto en uso y sellado también se puede detectar cuando se hace referencia al objeto en el que se hace referencia a Style 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 estilo BasedOn . Para obtener más información, consulta Controles BasedOn o Style.

Estilos implícitos

Puede definir estilos de forma que todos los objetos targetType usen implícitamente un estilo, sin necesidad de que cada instancia de un objeto de este tipo haga referencia específicamente al estilo 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 propiedad TargetType . Si establece el estilo implícitamente, el estilo solo se aplica a los tipos que coinciden exactamente con TargetType y no a los elementos derivados del valor TargetType . Por ejemplo, si crea un estilo implícitamente para todos los controles ToggleButton de la aplicación y la aplicación tiene controles ToggleButton y CheckBox (CheckBox deriva de ToggleButton), el estilo implícito "ToggleButton" solo se aplica a los controles ToggleButton .

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 Style en el código (por ejemplo, llamar a un constructor y crear los valores de Establecedor uno a uno) es muy poco frecuente. Los estilos se usan para las plantillas y las plantillas deben estar disponibles en el tiempo de carga xaml, por lo que cualquier estilo 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

Obtiene el CoreDispatcher al que está asociado este objeto. CoreDispatcher representa una instalación que puede tener acceso a 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