Recursos y códigoResources and Code

Esta información general se centra en cómo obtener acceso a los recursos de Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) o crearlos mediante código en lugar de sintaxis Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML).This overview concentrates on how Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) resources can be accessed or created using code rather than Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) syntax. Para obtener más información sobre el uso de recursos generales y recursos desde una perspectiva de la sintaxis XAMLXAML, consulte Recursos XAML.For more information on general resource usage and resources from a XAMLXAML syntax perspective, see XAML Resources.

Obtener acceso a recursos desde códigoAccessing Resources from Code

Las claves que identifican los recursos si se definen mediante XAMLXAML también se usan para recuperar recursos específicos si solicita el recurso en el código.The keys that identify resources if they are defined through XAMLXAML are also used to retrieve specific resources if you request the resource in code. Es la manera más sencilla de recuperar un recurso de código llamar a la FindResource o TryFindResource método desde los objetos de nivel de marco en la aplicación.The simplest way to retrieve a resource from code is to call either the FindResource or the TryFindResource method from framework-level objects in your application. La diferencia de comportamiento entre estos métodos es lo que ocurre si no se encuentra la clave solicitada.The behavioral difference between these methods is what happens if the requested key is not found. FindResource genera una excepción; TryFindResource no producirá una excepción, pero devuelve null.FindResource raises an exception; TryFindResource will not raise an exception but returns null. Cada método obtiene la clave de recurso como parámetro de entrada y devuelve un objeto escrito de manera imprecisa.Each method takes the resource key as an input parameter, and returns a loosely typed object. Normalmente, una clave de recurso es una cadena, pero hay usos ocasionales en los que no. Consulte la sección Usar objetos como claves para obtener más información.Typically, a resource key is a string, but there are occasional nonstring usages; see the Using Objects as Keys section for details. Normalmente, convertiría el objeto devuelto al tipo que necesita la propiedad que está estableciendo al solicitar el recurso.Typically you would cast the returned object to the type required by the property that you are setting when requesting the resource. La lógica de búsqueda para la resolución de recursos de código es la misma que la del caso XAMLXAML de referencia de recursos dinámicos.The lookup logic for code resource resolution is the same as the dynamic resource reference XAMLXAML case. La búsqueda de recursos comienza desde el elemento que realiza la llamada y continúa hasta los elementos principales sucesivos del árbol lógico.The search for resources starts from the calling element, then continues to successive parent elements in the logical tree. La búsqueda continúa hasta los recursos de la aplicación, los temas y los recursos del sistema, si es necesario.The lookup continues onwards into application resources, themes, and system resources if necessary. Una solicitud de código para un recurso representará correctamente los cambios en tiempo de ejecución en diccionarios de recursos que puedan haberse realizado después de que se cargara el diccionario desde XAMLXAML y también para cambios de recursos del sistema en tiempo real.A code request for a resource will properly account for runtime changes in resource dictionaries that might have been made subsequent to that resource dictionary being loaded from XAMLXAML, and also for realtime system resource changes.

El siguiente es un breve ejemplo de código que busca un recurso por clave y el valor devuelto se utiliza para establecer una propiedad, se implementa como un Click controlador de eventos.The following is a brief code example that finds a resource by key and uses the returned value to set a property, implemented as a Click event handler.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

Un método alternativo para asignar una referencia de recurso es SetResourceReference.An alternative method for assigning a resource reference is SetResourceReference. Este método usa dos parámetros: la clave del recurso y el identificador de una propiedad de dependencia determinada que existe en la instancia del elemento al que se debe asignar el valor del recurso.This method takes two parameters: the key of the resource, and the identifier for a particular dependency property that is present on the element instance to which the resource value should be assigned. Funcionalmente, este método es el mismo y tiene la ventaja de que no necesita ninguna conversión de valores devueltos.Functionally, this method is the same and has the advantage of not requiring any casting of return values.

Todavía hay otra manera de acceder a los recursos mediante programación es obtener acceso al contenido de la Resources propiedad como un diccionario.Still another way to access resources programmatically is to access the contents of the Resources property as a dictionary. Obtener acceso al diccionario que contiene esta propiedad también es el modo de agregar nuevos recursos a las colecciones existentes, comprobar si el nombre de una clave ya existe en la colección y otras operaciones de diccionario o colección.Accessing the dictionary contained by this property is also how you can add new resources to existing collections, check to see if a given key name is already taken in the collection, and other dictionary/collection operations. Si está escribiendo un WPFWPF aplicación completamente en código, se puede crear también toda la colección en el código, asignarle claves y, a continuación, asignar la colección acabada a la Resources propiedad de un elemento establecido.If you are writing a WPFWPF application entirely in code, you can also create the entire collection in code, assign keys to it, and then assign the finished collection to the Resources property of an established element. Esto se describe en la sección siguiente.This will be described in the next section.

Puede indizar dentro de cualquier Resources colección, utilizando una clave específica como índice, pero debe tener en cuenta que obtener acceso al recurso de esta manera no sigue las reglas de tiempo de ejecución normal de resolución de recursos.You can index within any given Resources collection, using a specific key as the index, but you should be aware that accessing the resource in this way does not follow the normal runtime rules of resource resolution. Solo obtiene acceso a esa colección concreta.You are only accessing that particular collection. La búsqueda de recursos no recorrerá el ámbito hasta la raíz o aplicación si no se encuentra ningún objeto válido en la clave solicitada.Resource lookup will not be traversing the scope to the root or the application if no valid object was found at the requested key. Sin embargo, este enfoque puede tener ventajas de rendimiento en algunos casos, precisamente porque el ámbito de la búsqueda de la clave está más restringido.However, this approach may have performance advantages in some cases precisely because the scope of the search for the key is more constrained. Consulte la ResourceDictionary clase para obtener más información sobre cómo trabajar directamente con el diccionario de recursos.See the ResourceDictionary class for more details on how to work with the resource dictionary directly.

Crear recursos mediante códigoCreating Resources with Code

Si quiere crear toda una aplicación WPFWPF con código, también es posible que quiera crear los recursos de la aplicación con código.If you want to create an entire WPFWPF application in code, you might also want to create any resources in that application in code. Para lograr esto, cree un nuevo ResourceDictionary de instancia y, a continuación, agregue todos los recursos al diccionario mediante llamadas sucesivas a ResourceDictionary.Add.To achieve this, create a new ResourceDictionary instance, and then add all the resources to the dictionary using successive calls to ResourceDictionary.Add. A continuación, utilice el ResourceDictionary , creado para establecer el Resources propiedad en un elemento que está presente en el ámbito de una página o el Application.Resources.Then, use the ResourceDictionary thus created to set the Resources property on an element that is present in a page scope, or the Application.Resources. También puede mantener el ResourceDictionary como un objeto independiente sin agregarlo a un elemento.You could also maintain the ResourceDictionary as a standalone object without adding it to an element. Sin embargo, si lo hace, deberá obtener acceso a los recursos que contenga mediante clave de producto, como si fuera un diccionario genérico.However, if you do this, you must access the resources within it by item key, as if it were a generic dictionary. Un ResourceDictionary que no está asociado a un elemento Resources propiedad no existirá como parte del árbol de elementos y no tiene ningún ámbito de una secuencia de búsqueda que puede usarse por FindResource y los métodos relacionados.A ResourceDictionary that is not attached to an element Resources property would not exist as part of the element tree and has no scope in a lookup sequence that can be used by FindResource and related methods.

Usar objetos como clavesUsing Objects as Keys

La mayoría de los usos de recursos establecen la clave de recurso en una cadena.Most resource usages will set the key of the resource to be a string. Sin embargo, varias características de WPFWPF no usan deliberadamente un tipo de cadena para especificar las claves. En su lugar, este parámetro es un objeto.However, various WPFWPF features deliberately do not use a string type to specify keys, instead this parameter is an object. La compatibilidad de temas y estilos de WPFWPF aprovecha la funcionalidad de que un objeto asigne la clave a un recurso.The capability of having the resource be keyed by an object is used by the WPFWPF style and theming support. Entre los estilos de temas que se convierten en el estilo predeterminado para un control sin estilo están organizados según el Type del control que se debe aplicar.The styles in themes which become the default style for an otherwise non-styled control are each keyed by the Type of the control that they should apply to. Asignar claves por tipo proporciona un mecanismo de búsqueda confiable que funciona en instancias predeterminadas de cada tipo de control. La reflexión puede detectar el tipo y usarlo para clases derivadas de estilo aunque el tipo derivado no tenga ningún estilo predeterminado.Being keyed by type provides a reliable lookup mechanism that works on default instances of each control type, and type can be detected by reflection and used for styling derived classes even though the derived type otherwise has no default style. Puede especificar un Type clave para un recurso definido en XAMLXAML utilizando el x: Type Markup Extension.You can specify a Type key for a resource defined in XAMLXAML by using the x:Type Markup Extension. Existen extensiones similares para otros usos de clave que no son cadenas que admiten características de WPFWPF, como ComponentResourceKey (extensión de marcado).Similar extensions exist for other nonstring key usages that support WPFWPF features, such as ComponentResourceKey Markup Extension.

Vea tambiénSee also