2010-01-22 22 views
49

Tengo una colección personalizada definida en mis recursos ventana siguiente (en una aplicación SketchFlow lo que la ventana es en realidad un control de usuario):acceder a un recurso a través de código subyacente en WPF

<UserControl.Resources> 
    <ds:MyCollection x:Key="myKey" x:Name="myName" /> 
</UserControl.Resources> 

Quiero ser capaz de hacer referencia a esta colección en el código subyacente, que esperaba que fuera por la x: Nombre, pero parece que no puedo acceder a ella.

puedo obtener una referencia a él mediante

myRef = (MyCollection) this.FindName("myKey"); 

pero esto parece hacker. ¿Es esta mala práctica, y qué sería mejor? Gracias :)

Respuesta

57

Debe utilizar System.Windows.Controls.UserControl 's FindResource() o TryFindResource() métodos.

Además, una buena práctica es crear una constante de cadena que mapee el nombre de su clave en el diccionario de recursos (para que pueda cambiarla en un solo lugar).

+2

Se puede utilizar: Application.Current.FindResource (errorColorResourceName) como MiColeccion o this.FindResource ("RainbowBrush") como MiColeccion. Depende del contexto. –

20

También puede usar this.Resources["mykey"]. Supongo que eso no es mucho mejor que tu propia sugerencia.

respuesta
+0

Esto es para Windows 8 Store Apps. – cederlof

+2

@cederlof, también puede usar esto con WPF. –

11

No exactamente directa, pero fuertemente relacionada:

En caso de que los recursos están en un archivo diferente - por ejemplo ResourceDictionary.xaml

simplemente puede añadir x:Class a ella:

<ResourceDictionary x:Class="Namespace.NewClassName" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
    <ds:MyCollection x:Key="myKey" x:Name="myName" /> 
</ResourceDictionary> 

Y luego úsela en el código detrás:

var res = new Namespace.NewClassName(); 
var col = res["myKey"]; 
+3

+1, pero para poder encontrar recursos usando su clave tuve que llamar 'res.InitializeComponent()' antes de intentar acceder a la clave; de ​​lo contrario, el objeto no mostraría las teclas y la llamada a 'res [" myKey "]' devolvería nulo. –

+0

Wow, eso es increíble ... ¡Nunca pensé que pudieras hacer eso y solo resolvió un problema rápido y fácil para mí! Necesité llamar a InitializeComponent() como dijo @StephenRoss, pero aparte de eso funciona como un hechizo. – sfaust

3

Se puede utilizar una clave de recurso así:

<UserControl.Resources> 
    <SolidColorBrush x:Key="{x:Static local:Foo.MyKey}">Blue</SolidColorBrush> 
</UserControl.Resources> 
<Grid Background="{StaticResource {x:Static local:Foo.MyKey}}" /> 

public partial class Foo : UserControl 
{ 
    public Foo() 
    { 
     InitializeComponent(); 
     var brush = (SolidColorBrush)FindResource(MyKey); 
    } 

    public static ResourceKey MyKey { get; } = CreateResourceKey(); 

    private static ComponentResourceKey CreateResourceKey([CallerMemberName] string caller = null) 
    { 
     return new ComponentResourceKey(typeof(Foo), caller); ; 
    } 
} 
+0

Tenga en cuenta que esto depende del tipo de clave. P.ej. una clave en 'DataTemplate' es de tipo' DataTemplateKey'. –

Cuestiones relacionadas