2009-03-06 13 views
51

Tengo un DataTemplate definido en un archivo xaml al que quiero acceder mediante el código C#. ¿Alguien puede decirme cómo puedo acceder a él? Agregué un nuevo archivo ResourceDictionary y su nombre es Dictionary1.xaml. tengo una plantilla de datos tales como:¿Cómo puedo acceder a ResourceDictionary en wpf desde el código C#?

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DataTemplate x:Key="mytemplate"> 
     <TextBlock Text="Name:" Background="Blue"/> 
    </DataTemplate> 
</ResourceDictionary> 

no tengo una llamada ListBox listBox1 y quiero asignarlo a la propiedad es Itemtemplate pero no estoy consiguiendo cómo puedo hacerlo?

Respuesta

50

Donde es exactamente lo que definirlo?

Si se define en el ResourceDictionary de su objeto, entonces

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

debería funcionar. Si lo está definiendo como miembro de otra cosa, como por ejemplo, un Control de elementos, necesita obtener un control de la instancia ItemsControl y llamar a la propiedad ItemTemplate.

Editar: Bien, creo que estamos llegando a algún lado. Entonces está definiendo un ResourceDictionary en su propio archivo. Antes de poder usarlo en su UI y acceder desde su código, necesita fusionar ese ResourceDictionary en su aplicación. ¿Estás haciendo esto?

Si lo es, entonces el siguiente paso es obtener este recurso. Cada FrameworkElement tiene un método llamado FindResource. Este método es excelente porque recorre el árbol ResourceDictionary e intenta localizar el recurso con la clave. Por lo tanto, si desea acceder a este recurso desde un control de usuario, puede hacer lo siguiente en el código detrás:

FindResource(typeof(yourDataTemplateTargetType)); 

Si esto no funciona para usted, por favor, nos muestran exactamente cómo se está declarando este diccionario de recursos y cómo se fusiona en los recursos de su aplicación.

+1

No entiendo. Esta respuesta no usa la clave. –

+0

FindResource toma un argumento, la clave. typeof (yourDataTemplateTargetType) es la clave en este ejemplo. –

+0

Hola. ¿Qué pasa si la clave no es un tipo, sino una cadena como en el ejemplo de OP? –

7

Si, por ejemplo, tiene una plantilla de botón en su diccionario de recursos en el App.xaml archivo que se pueda acceder a él usando el siguiente código:

Application.Current.Resources[typeof(Button)] 
46

Desde Application.Current era nula en mi caso, he terminado de utilizar este:

var myResourceDictionary = new ResourceDictionary(); 
    myResourceDictionary.Source = 
     new Uri("/DllName;component/Resources/MyResourceDictionary.xaml", 
       UriKind.RelativeOrAbsolute); 

y luego conseguir la clave especificada que necesitaba mediante el uso de myResourceDictionary["KeyName"] as TypeOfItem

(source)

+2

Personalmente creo que este es el mejor enfoque, como si tuvieras que definir esto en una biblioteca o en cualquier lugar, todavía funcionaría, mientras que como la respuesta aceptada, debes fusionar todos los diccionarios en tu aplicación, lo que puede ser una exageración, o no viable. –

+0

¿Puede explicar por qué utilizar var en lugar de ResourceDictionary – Venkat

+0

@Venkat? Lo recomendaría echar un vistazo [aquí] (http://stackoverflow.com/questions/1873873/why-does-resharper-want-to-use -var-for-everything) y tenga en cuenta que esto no es obligatorio :-) – itsho

1

Puede acceder a un diccionario de recursos que agregó a su proyecto de la siguiente manera:

var rd = new ResourceDictionary(); 
rd.Source = new Uri("ms-appx:///Dictionary1.xaml"); 

A continuación, puede acceder a un recurso almacenado en el diccionario de recursos, así:

someObject.Property = rd["mytemplate"]; 

NOTA:
Usted tendrá que modificar el URI para el diccionario de recursos de acuerdo a la ubicación que lo creó en relación con el directorio base del proyecto.

0

Cualquiera de los enfoques anteriores funciona conseguir el recurso basado en la ubicación, si está siguiendo MVVMm recomendaría hacerlo de esta manera:

  1. crear un servicio como ProvideDataTemplateService, (para crear un servicio de heredar habitual de Comportamiento)
  2. Use el Contenedor de su elección para inyectar este servicio donde le gustaría tener ases a DataTemple.
Cuestiones relacionadas