Aplicar estilos y plantillasStyling and Templating

La aplicación de estilos y plantillas de Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) hace referencia a un conjunto de características (estilos, plantillas, desencadenadores y guiones gráficos) que permiten a los desarrolladores y diseñadores crear efectos visualmente atractivos y una apariencia coherente para su producto.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) styling and templating refer to a suite of features (styles, templates, triggers, and storyboards) that allow developers and designers to create visually compelling effects and to create a consistent appearance for their product. Aunque los desarrolladores y los diseñadores pueden personalizar muchas apariencias aplicación por aplicación, es necesario un modelo de aplicación de estilos y plantillas para el mantenimiento y el uso compartido de la apariencia entre las distintas aplicaciones.Although developers and or designers can customize the appearance extensively on an application-by-application basis, a strong styling and templating model is necessary to allow maintenance and sharing of the appearance within and among applications. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) ofrece ese modelo.provides that model.

Otra característica del modelo de aplicación de estilos y plantillas de WPFWPF es la separación de la presentación y la lógica.Another feature of the WPFWPF styling model is the separation of presentation and logic. Esto significa que los diseñadores pueden trabajar en la apariencia de una aplicación solo con usar XAMLXAML mientras los desarrolladores trabajan en la lógica de programación con C# o Visual Basic.This means that designers can work on the appearance of an application by using only XAMLXAML at the same time that developers work on the programming logic by using C# or Visual Basic.

Esta información general se centra en los aspectos de los estilos y las plantillas de la aplicación y no abarca los conceptos de enlace de datos.This overview focuses on the styling and templating aspects of the application and does not discuss any data binding concepts. Para información sobre el enlace de datos, consulte Data Binding Overview (Introducción al enlace de datos).For information about data binding, see Data Binding Overview.

Además, es importante entender los recursos, gracias a los cuales se pueden reutilizar los estilos y las plantillas.In addition, it is important to understand resources, which are what enable styles and templates to be reused. Para más información acerca de los recursos, consulte XAML Resources (Recursos de XAML).For more information about resources, see XAML Resources.

Ejemplo de aplicación de estilos y plantillasStyling and Templating Sample

Los ejemplos de código de esta introducción se basan en la sencilla foto de ejemplo de la siguiente ilustración:The code examples used in this overview are based on a simple photo sample shown in the following illustration:

ListView con estiloStyled ListView

En esta sencilla foto de ejemplo se aplican estilos y plantillas para crear una experiencia de usuario visualmente atractiva.This simple photo sample uses styling and templating to create a visually compelling user experience. El ejemplo tiene dos TextBlock elementos y un ListBox control que está enlazado a una lista de imágenes.The sample has two TextBlock elements and a ListBox control that is bound to a list of images. Para el ejemplo completo, consulte Introducción a la aplicación de estilos y plantillas de ejemplo.For the complete sample, see Introduction to Styling and Templating Sample.

Conceptos básicos del estiloStyle Basics

Se puede considerar un Style como una manera cómoda para aplicar un conjunto de valores de propiedad a más de un elemento.You can think of a Style as a convenient way to apply a set of property values to more than one element. Por ejemplo, considere la siguiente TextBlock elementos y su apariencia predeterminada:For example, consider the following TextBlock elements and their default appearance:

<TextBlock>My Pictures</TextBlock>
<TextBlock>Check out my new pictures!</TextBlock>

Captura de pantalla de ejemplo de aplicación de estilosStyling sample screenshot

Puede cambiar la apariencia predeterminada estableciendo las propiedades, como FontSize y FontFamily, en cada TextBlock directamente el elemento.You can change the default appearance by setting properties, such as FontSize and FontFamily, on each TextBlock element directly. Sin embargo, si desea que su TextBlock elementos que se van a compartir algunas propiedades, puede crear un Style en el Resources sección de su XAMLXAML de archivos, como se muestra aquí:However, if you want your TextBlock elements to share some properties, you can create a Style in the Resources section of your XAMLXAML file, as shown here:

<Window.Resources>
<!--A Style that affects all TextBlocks-->
<Style TargetType="TextBlock">
  <Setter Property="HorizontalAlignment" Value="Center" />
  <Setter Property="FontFamily" Value="Comic Sans MS"/>
  <Setter Property="FontSize" Value="14"/>
</Style>
</Window.Resources>

Al establecer el TargetType de su estilo para el TextBlock tipo, el estilo se aplica a todos los TextBlock elementos en la ventana.When you set the TargetType of your style to the TextBlock type, the style is applied to all the TextBlock elements in the window.

Ahora el TextBlock elementos aparecerán como sigue:Now the TextBlock elements appear as follows:

Captura de pantalla de ejemplo de aplicación de estilosStyling sample screenshot

Ampliación de los estilosExtending Styles

Quizás desee que los dos TextBlock elementos compartan algunos valores de propiedad, como el FontFamily y el texto centrado HorizontalAlignment, pero también desea que el texto "My Pictures" tenga propiedades adicionales.Perhaps you want your two TextBlock elements to share some property values, such as the FontFamily and the centered HorizontalAlignment, but you also want the text "My Pictures" to have some additional properties. Puede conseguirlo al crear un nuevo estilo basado en el primero, como se muestra aquí:You can do that by creating a new style that is based on the first style, as shown here:

<Window.Resources>
<!--A Style that extends the previous TextBlock Style-->
<!--This is a "named style" with an x:Key of TitleText-->
<Style BasedOn="{StaticResource {x:Type TextBlock}}"
       TargetType="TextBlock"
       x:Key="TitleText">
  <Setter Property="FontSize" Value="26"/>
  <Setter Property="Foreground">
  <Setter.Value>
      <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
        <LinearGradientBrush.GradientStops>
          <GradientStop Offset="0.0" Color="#90DDDD" />
          <GradientStop Offset="1.0" Color="#5BFFFF" />
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>
</Style>
</Window.Resources>

Observe que el estilo anterior tiene un valor x:Key.Notice that the previous style is given an x:Key. Para aplicar el estilo, establezca la Style propiedad en su TextBlock a la x:Key valor, como se muestra aquí:To apply the style, you set the Style property on your TextBlock to the x:Key value, as shown here:

<TextBlock Style="{StaticResource TitleText}" Name="textblock1">My Pictures</TextBlock>
<TextBlock>Check out my new pictures!</TextBlock>

Esto TextBlock estilo tiene ahora un HorizontalAlignment valor de Center, un FontFamily valor de Comic Sans MS, un FontSize valor 26 y un Foreground valor establecido en el LinearGradientBrush se muestra en el ejemplo.This TextBlock style now has a HorizontalAlignment value of Center, a FontFamily value of Comic Sans MS, a FontSize value of 26, and a Foreground value set to the LinearGradientBrush shown in the example. Tenga en cuenta que reemplaza el FontSize valor del estilo base.Notice that it overrides the FontSize value of the base style. Si hay más de un Setter establecen la misma propiedad un Style, el Setter es declarada última tiene prioridad.If there is more than one Setter setting the same property in a Style, the Setter that is declared last takes precedence.

La continuación muestra lo que el TextBlock elementos el aspecto siguiente:The following shows what the TextBlock elements now look like:

TextBlocks con estiloStyled TextBlocks

Esto TitleText estilo amplía el estilo que se ha creado para el TextBlock tipo.This TitleText style extends the style that has been created for the TextBlock type. También puede ampliar un estilo con x:Key mediante el valor x:Key.You can also extend a style that has an x:Key by using the x:Key value. Para obtener un ejemplo, vea el ejemplo proporcionado para el BasedOn propiedad.For an example, see the example provided for the BasedOn property.

Relación entre la propiedad TargetType y el atributo x:KeyRelationship of the TargetType Property and the x:Key Attribute

Como se muestra en el primer ejemplo, establecer el TargetType propiedad TextBlock sin asignar al estilo un x:Key hace que el estilo que se aplica a todos los TextBlock elementos.As shown in the first example, setting the TargetType property to TextBlock without assigning the style an x:Key causes the style to be applied to all TextBlock elements. En este caso, x:Key se establece implícitamente en {x:Type TextBlock}.In this case, the x:Key is implicitly set to {x:Type TextBlock}. Esto significa que si se establece explícitamente el x:Key a cualquier otro valor distinto {x:Type TextBlock}, Style no se aplica a todos los TextBlock elementos automáticamente.This means that if you explicitly set the x:Key value to anything other than {x:Type TextBlock}, the Style is not applied to all TextBlock elements automatically. En su lugar, debe aplicar el estilo (mediante el uso de la x:Key valor) a la TextBlock elementos explícitamente.Instead, you must apply the style (by using the x:Key value) to the TextBlock elements explicitly. Si el estilo está en la sección de recursos y no se establece la TargetType la propiedad en su estilo, a continuación, se debe proporcionar un x:Key.If your style is in the resources section and you do not set the TargetType property on your style, then you must provide an x:Key.

Además de proporcionar un valor predeterminado para el x:Key, el TargetType propiedad especifica el tipo al que se aplican las propiedades del establecedor.In addition to providing a default value for the x:Key, the TargetType property specifies the type to which setter properties apply. Si no especifica un TargetType, debe calificar las propiedades en su Setter objetos con un nombre de clase mediante la sintaxis Property="ClassName.Property".If you do not specify a TargetType, you must qualify the properties in your Setter objects with a class name by using the syntax Property="ClassName.Property". Por ejemplo, en lugar de establecer Property="FontSize", debe establecer Property a "TextBlock.FontSize" o "Control.FontSize".For example, instead of setting Property="FontSize", you must set Property to "TextBlock.FontSize" or "Control.FontSize".

Tenga en cuenta también que muchos controles WPFWPF son una combinación de otros controles WPFWPF.Also note that many WPFWPF controls consist of a combination of other WPFWPF controls. Si crea un estilo aplicable a todos los controles de un tipo, podría obtener resultados inesperados.If you create a style that applies to all controls of a type, you might get unexpected results. Por ejemplo, si crea un estilo que tiene como destino el TextBlock escriba en un Window, el estilo se aplica a todos los TextBlock controles en la ventana, incluso si la TextBlock forma parte de otro control, como un ListBox.For example, if you create a style that targets the TextBlock type in a Window, the style is applied to all TextBlock controls in the window, even if the TextBlock is part of another control, such as a ListBox.

Estilos y recursosStyles and Resources

Puede utilizar un estilo en cualquier elemento que se deriva de FrameworkElement o FrameworkContentElement.You can use a style on any element that derives from FrameworkElement or FrameworkContentElement. La manera más común de declarar un estilo es como recurso en la sección Resources de un archivo XAMLXAML, como se muestra en los ejemplos anteriores.The most common way to declare a style is as a resource in the Resources section in a XAMLXAML file, as shown in the previous examples. Dado que los estilos son recursos, siguen las mismas reglas de ámbito que se aplican a todos los recursos; el lugar donde se declara un estilo afecta al lugar donde se aplica.Because styles are resources, they obey the same scoping rules that apply to all resources; where you declare a style affects where the style can be applied. Por ejemplo, si se declara el estilo en el elemento raíz del archivo XAMLXAML de definición de aplicación, este se puede usar en cualquier parte de la aplicación.For example, if you declare the style in the root element of your application definition XAMLXAML file, the style can be used anywhere in your application. Si se crea una aplicación de navegación y se declara en uno de los archivos XAMLXAML de la aplicación, el estilo se puede usar únicamente en ese archivo XAMLXAML.If you create a navigation application and declare the style in one of the application's XAMLXAML files, the style can be used only in that XAMLXAML file. Para más información acerca de las reglas de ámbito de los recursos, consulte Recursos XAML.For more information about scoping rules for resources, see XAML Resources.

Además, encontrará más información sobre estilos y recursos en Recursos y temas compartidos más adelante en esta introducción.In addition, you can find more information about styles and resources in Shared Resources and Themes later in this overview.

Establecer estilos mediante programaciónSetting Styles Programmatically

Para asignar un estilo con nombre a un elemento mediante programación, obtenga el estilo de la colección de recursos y la asigna a la propiedad del elemento Style propiedad.To assign a named style to an element programmatically, get the style from the resources collection and assign it to the element's Style property. Tenga en cuenta que los elementos de una colección de recursos son del tipo Object.Note that the items in a resources collection are of type Object. Por lo tanto, debe convertir el estilo recuperado a un Style antes de asignarlo a la Style propiedad.Therefore, you must cast the retrieved style to a Style before assigning it to the Style property. Por ejemplo, para establecer el definido TitleText estilo en un TextBlock denominado textblock1, realice lo siguiente:For example, to set the defined TitleText style on a TextBlock named textblock1, do the following:

textblock1.Style = (Style)(this.Resources["TitleText"]);
textblock1.Style = CType(Me.Resources("TitleText"), Style)

Tenga en cuenta que una vez que se ha aplicado un estilo, queda sellado y no se puede cambiar.Note that once a style has been applied, it is sealed and cannot be changed. Si desea cambiar dinámicamente un estilo que ya se han aplicado, debe crear uno nuevo que reemplace el existente.If you want to dynamically change a style that has already been applied, you must create a new style to replace the existing one. Para obtener más información, vea la propiedad IsSealed.For more information, see the IsSealed property.

Puede crear un objeto que elija un estilo que se aplique según una lógica personalizada.You can create an object that chooses a style to apply based on custom logic. Para obtener un ejemplo, vea el ejemplo proporcionado para el StyleSelector clase.For an example, see the example provided for the StyleSelector class.

Enlaces, recursos dinámicos y controladores de eventosBindings, Dynamic Resources, and Event Handlers

Tenga en cuenta que puede utilizar la propiedad Setter.Value para especificar una Extensión de marcado de enlace o una Extensión de marcado DynamicResource.Note that you can use the Setter.Value property to specify a Binding Markup Extension or a DynamicResource Markup Extension. Para obtener más información, vea los ejemplos proporcionados para el Setter.Value propiedad.For more information, see the examples provided for the Setter.Value property.

Hasta ahora, en esta introducción solo se trata el uso de establecedores para establecer el valor de propiedad.So far, this overview only discusses the use of setters to set property value. También puede especificar controladores de eventos en un estilo.You can also specify event handlers in a style. Para obtener más información, consulta EventSetter.For more information, see EventSetter.

Plantillas de datosData Templates

En esta aplicación de ejemplo, hay un ListBox control que está enlazado a una lista de fotos:In this sample application, there is a ListBox control that is bound to a list of photos:

<ListBox ItemsSource="{Binding Source={StaticResource MyPhotos}}"
         Background="Silver" Width="600" Margin="10" SelectedIndex="0"/>

Esto ListBox actualmente el siguiente aspecto:This ListBox currently looks like the following:

ListBox antes de la plantillaListBox before applying template

La mayoría de los controles tiene algún tipo de contenido, que a menudo procede de datos a los cuales se va a enlazar.Most controls have some type of content, and that content often comes from data that you are binding to. En este ejemplo, los datos son la lista de fotos.In this sample, the data is the list of photos. En WPFWPF, usa un DataTemplate para definir la representación visual de los datos.In WPFWPF, you use a DataTemplate to define the visual representation of data. Básicamente, lo que se incluye en un DataTemplate determina el aspecto de los datos en la aplicación representada.Basically, what you put into a DataTemplate determines what the data looks like in the rendered application.

En nuestra aplicación de ejemplo, cada objeto Photo personalizado tiene una propiedad Source de tipo cadena que especifica la ruta de acceso de la imagen.In our sample application, each custom Photo object has a Source property of type string that specifies the file path of the image. Actualmente, los objetos de foto aparecen como rutas de acceso de archivo.Currently, the photo objects appear as file paths.

Para que las fotos aparezcan como imágenes, crea un DataTemplate como un recurso:For the photos to appear as images, you create a DataTemplate as a resource:

<Window.Resources>
<!--DataTemplate to display Photos as images
    instead of text strings of Paths-->
<DataTemplate DataType="{x:Type local:Photo}">
  <Border Margin="3">
    <Image Source="{Binding Source}"/>
  </Border>
</DataTemplate>
</Window.Resources>

Tenga en cuenta que el DataType propiedad es muy similar a la TargetType propiedad de la Style.Notice that the DataType property is very similar to the TargetType property of the Style. Si su DataTemplate está en la sección de recursos, cuando se especifica la DataType propiedad a un tipo y no asignarle un x:Key, el DataTemplate se aplica cada vez que aparezca ese tipo.If your DataTemplate is in the resources section, when you specify the DataType property to a type and not assign it an x:Key, the DataTemplate is applied whenever that type appears. Siempre tiene la opción para asignar el DataTemplate con un x:Key y vuelva a establecerla como un StaticResource para propiedades que toman DataTemplate tipos, como la ItemTemplate propiedad o el ContentTemplate propiedad.You always have the option to assign the DataTemplate with an x:Key and then set it as a StaticResource for properties that take DataTemplate types, such as the ItemTemplate property or the ContentTemplate property.

En esencia, el DataTemplate en el ejemplo anterior define que siempre que haya un Photo objeto, debe aparecer como un Image dentro de un Border.Essentially, the DataTemplate in the above example defines that whenever there is a Photo object, it should appear as an Image within a Border. Con esto DataTemplate, nuestra aplicación ahora tiene este aspecto:With this DataTemplate, our application now looks like this:

Imagen de fotoPhoto image

El modelo de plantillas de datos proporciona otras características.The data templating model provides other features. Por ejemplo, si se va a mostrar datos de la colección que contienen otras colecciones mediante un HeaderedItemsControl escriba como un Menu o un TreeView, existe la HierarchicalDataTemplate.For example, if you are displaying collection data that contains other collections using a HeaderedItemsControl type such as a Menu or a TreeView, there is the HierarchicalDataTemplate. Otra característica de plantillas de datos es el DataTemplateSelector, que le permite elegir un DataTemplate usar según una lógica personalizada.Another data templating feature is the DataTemplateSelector, which allows you to choose a DataTemplate to use based on custom logic. Para más información, consulte Data Templating Overview (Introducción a las plantillas de datos), que proporciona una explicación más detallada de las características de las distintas plantillas de datos.For more information, see Data Templating Overview, which provides a more in-depth discussion of the different data templating features.

Plantillas de controlControl Templates

En WPFWPF, el ControlTemplate de un control define la apariencia del control.In WPFWPF, the ControlTemplate of a control defines the appearance of the control. Puede cambiar la estructura y la apariencia de un control mediante la definición de un nuevo ControlTemplate para el control.You can change the structure and appearance of a control by defining a new ControlTemplate for the control. En muchos casos, esto ofrece la flexibilidad suficiente para no tener que escribir controles personalizados.In many cases, this gives you enough flexibility so that you do not have to write your own custom controls. Para más información, consulte Customizing the Appearance of an Existing Control by Creating a ControlTemplate (Personalizar la apariencia de un control existente mediante la creación de una clase ControlTemplate).For more information, see Customizing the Appearance of an Existing Control by Creating a ControlTemplate.

DesencadenadoresTriggers

Un desencadenador establece propiedades o inicia acciones, como una animación, cuando se genera un evento o cambia un valor de propiedad.A trigger sets properties or starts actions, such as an animation, when a property value changes or when an event is raised. Style, ControlTemplate, y DataTemplate todos tienen un Triggers propiedad que puede contener un conjunto de desencadenadores.Style, ControlTemplate, and DataTemplate all have a Triggers property that can contain a set of triggers. Hay varios tipos de desencadenadores.There are various types of triggers.

Desencadenadores de propiedadProperty Triggers

Un Trigger valores de propiedad de conjuntos, o inicia acciones en función del valor de una propiedad se llama a un desencadenador de propiedad.A Trigger that sets property values or starts actions based on the value of a property is called a property trigger.

Para demostrar cómo usar desencadenadores de propiedad, puede realizar con cada ListBoxItem parcialmente transparente a menos que lo está.To demonstrate how to use property triggers, you can make each ListBoxItem partially transparent unless it is selected. El siguiente estilo establece la Opacity valor de un ListBoxItem a 0.5.The following style sets the Opacity value of a ListBoxItem to 0.5. Cuando el IsSelected propiedad es true, sin embargo, el Opacity está establecido en 1.0:When the IsSelected property is true, however, the Opacity is set to 1.0:

<Style TargetType="ListBoxItem">
  <Setter Property="Opacity" Value="0.5" />
  <Setter Property="MaxHeight" Value="75" />
  <Style.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Setter Property="Opacity" Value="1.0" />
    </Trigger>
  </Style.Triggers>
</Style>

Este ejemplo se usa un Trigger para establecer un valor de propiedad, pero tenga en cuenta que el Trigger clase también tiene la EnterActions y ExitActions propiedades que permiten a un desencadenador realizar acciones.This example uses a Trigger to set a property value, but note that the Trigger class also has the EnterActions and ExitActions properties that enable a trigger to perform actions.

Tenga en cuenta que el MaxHeight propiedad de la ListBoxItem está establecido en 75.Notice that the MaxHeight property of the ListBoxItem is set to 75. En la siguiente ilustración, el tercer elemento es el seleccionado:In the following illustration, the third item is the selected item:

ListView con estiloStyled ListView

Clases EventTrigger y objetos StoryboardEventTriggers and Storyboards

Otro tipo de desencadenador es la EventTrigger, que inicia un conjunto de acciones en función de la aparición de un evento.Another type of trigger is the EventTrigger, which starts a set of actions based on the occurrence of an event. Por ejemplo, la siguiente EventTrigger objetos especifican que, cuando el puntero del mouse entra en el ListBoxItem, el MaxHeight propiedad anima a un valor de 90 a través de un 0.2 segundo período.For example, the following EventTrigger objects specify that when the mouse pointer enters the ListBoxItem, the MaxHeight property animates to a value of 90 over a 0.2 second period. Cuando se desplaza el mouse fuera del elemento, la propiedad vuelve al valor original durante un período de 1 segundo.When the mouse moves away from the item, the property returns to the original value over a period of 1 second. Tenga en cuenta cómo no es necesario especificar un To valor para el MouseLeave animación.Note how it is not necessary to specify a To value for the MouseLeave animation. Esto se debe a que la animación realiza el seguimiento del valor original.This is because the animation is able to keep track of the original value.

<EventTrigger RoutedEvent="Mouse.MouseEnter">
  <EventTrigger.Actions>
    <BeginStoryboard>
      <Storyboard>
        <DoubleAnimation
          Duration="0:0:0.2"
          Storyboard.TargetProperty="MaxHeight"
          To="90"  />
      </Storyboard>
    </BeginStoryboard>
  </EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
  <EventTrigger.Actions>
    <BeginStoryboard>
      <Storyboard>
        <DoubleAnimation
          Duration="0:0:1"
          Storyboard.TargetProperty="MaxHeight"  />
      </Storyboard>
    </BeginStoryboard>
  </EventTrigger.Actions>
</EventTrigger>

Para más información, consulte Storyboards Overview (Introducción a los objetos Storyboard).For more information, see the Storyboards Overview.

En la siguiente ilustración, el mouse apunta al tercer elemento:In the following illustration, the mouse is pointing to the third item:

Captura de pantalla de ejemplo de aplicación de estilosStyling sample screenshot

Clases MultiTrigger, DataTrigger y MultiDataTriggerMultiTriggers, DataTriggers, and MultiDataTriggers

Además Trigger y EventTrigger, existen otros tipos de desencadenadores.In addition to Trigger and EventTrigger, there are other types of triggers. MultiTrigger permite establecer valores de propiedad según varias condiciones.MultiTrigger allows you to set property values based on multiple conditions. Usa DataTrigger y MultiDataTrigger cuando la propiedad de la condición está enlazada a datos.You use DataTrigger and MultiDataTrigger when the property of your condition is data-bound.

Recursos compartidos y temasShared Resources and Themes

Una aplicación típica de Windows Presentation Foundation (WPF) podría tener varios recursos de interfaz de usuario que se aplican en toda la aplicación.A typical Windows Presentation Foundation (WPF) application might have multiple user interface (UI) resources that are applied throughout the application. En su conjunto, estos recursos pueden considerarse el tema para la aplicación.Collectively, this set of resources can be considered the theme for the application. Windows Presentation Foundation (WPF) proporciona soporte técnico para el usuario de empaquetado recursos de la interfaz (IU) como un tema mediante un diccionario de recursos que se encapsula como el ResourceDictionary clase.Windows Presentation Foundation (WPF) provides support for packaging user interface (UI) resources as a theme by using a resource dictionary that is encapsulated as the ResourceDictionary class.

Los temas de Windows Presentation Foundation (WPF) se definen mediante el estilo y el mecanismo de plantillas que Windows Presentation Foundation (WPF) expone para personalizar los objetos visuales de cualquier elemento.Windows Presentation Foundation (WPF) themes are defined by using the styling and templating mechanism that Windows Presentation Foundation (WPF) exposes for customizing the visuals of any element.

Los recursos de tema de Windows Presentation Foundation (WPF) se almacenan en diccionarios de recursos incrustados.Windows Presentation Foundation (WPF) theme resources are stored in embedded resource dictionaries. Estos diccionarios de recursos deben estar incrustados en un ensamblado firmado, ya sea en el mismo ensamblado que el propio código o en uno en paralelo.These resource dictionaries must be embedded within a signed assembly, and can either be embedded in the same assembly as the code itself or in a side-by-side assembly. En el caso de PresentationFramework.dll, el ensamblado que contiene controles de Windows Presentation Foundation (WPF), los recursos de tema están en una serie de ensamblados en paralelo.In the case of PresentationFramework.dll, the assembly which contains Windows Presentation Foundation (WPF) controls, theme resources are in a series of side-by-side assemblies.

El tema se convierte en el último lugar donde buscar el estilo de un elemento.The theme becomes the last place to look when searching for the style of an element. Normalmente, se comenzará por el árbol de elementos en busca de un recurso adecuado, a continuación, se buscará en la colección de recursos de aplicación y finalmente, se consultará el sistema.Typically, the search will begin by walking up the element tree searching for an appropriate resource, then look in the application resource collection and finally query the system. Esto proporciona a los desarrolladores de aplicaciones una oportunidad para volver a definir el estilo de cualquier objeto en el nivel de árbol o de aplicación antes de alcanzar el tema.This gives application developers a chance to redefine the style for any object at the tree or application level before reaching the theme.

Los diccionarios de recursos se pueden redefinir como archivos individuales para reutilizar un tema en varias aplicaciones.You can define resource dictionaries as individual files that enable you to reuse a theme across multiple applications. También se pueden crear temas intercambiables al definir varios diccionarios de recursos que proporcionen los mismos tipos de recursos, pero con diferentes valores.You can also create swappable themes by defining multiple resource dictionaries that provide the same types of resources but with different values. Redefinir estos estilos u otros recursos en el nivel de aplicación es el enfoque recomendado para aplicar una máscara a una aplicación.Redefining these styles or other resources at the application level is the recommended approach for skinning an application.

Para compartir un conjunto de recursos, incluidos los estilos y plantillas, en todas las aplicaciones, puede crear un XAMLXAML de archivos y definir un ResourceDictionary.To share a set of resources, including styles and templates, across applications, you can create a XAMLXAML file and define a ResourceDictionary. Por ejemplo, eche un vistazo en la ilustración siguiente, donde se muestra parte del ejemplo de aplicación de estilo con la clase ControlTemplate:For example, take a look at the following illustration that shows part of the Styling with ControlTemplates Sample:

Ejemplos de Control TemplateControl Template Examples

Si observa los archivos XAMLXAML del ejemplo, observará que todos tienen lo siguiente:If you look at the XAMLXAML files in the sample, you will notice that the files all have the following:

<ResourceDictionary.MergedDictionaries>
  <ResourceDictionary Source="Shared.xaml" />
</ResourceDictionary.MergedDictionaries>

Es el uso compartido de shared.xaml, que define un ResourceDictionary que contiene un conjunto de recursos de pincel y estilos que permite a los controles en el ejemplo para tener una apariencia coherente.It is the sharing of shared.xaml, which defines a ResourceDictionary that contains a set of style and brush resources that enables the controls in the sample to have a consistent look.

Para más información, consulte Merged Resource Dictionaries (Diccionarios de recursos combinados).For more information, see Merged Resource Dictionaries.

Si va a crear un tema para su control personalizado, consulte la sección de la biblioteca de controles externos de Control Authoring Overview (Introducción a la creación de controles).If you are creating a theme for you custom control, see the External Control Library section of the Control Authoring Overview.

Vea tambiénSee also