2009-03-06 13 views
51

Ho un DataTemplate definito in un file xaml a cui voglio accedere tramite codice C#. Qualcuno può dirmi come posso accedervi? Ho aggiunto un nuovo file ResourceDictionary e il suo nome è Dictionary1.xaml. ho un modello di dati come ad esempio:Come posso accedere a ResourceDictionary in wpf dal codice 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> 

non ho un ListBox chiamato listBox1 e voglio assegnare alla sua Itemtemplate proprietà ma io non sono sempre come posso farlo?

risposta

50

Dove esattamente stai definirlo?

Se si definisce nella ResourceDictionary del vostro oggetto, quindi

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

dovrebbe funzionare. Se lo stai definendo come membro di qualcos'altro, come ad esempio un ItemsControl, devi ottenere un handle per l'istanza ItemsControl e chiamare la proprietà ItemTemplate.

Modifica: Ok, penso che stiamo arrivando da qualche parte. Quindi stai definendo un ResourceDictionary nel suo stesso file. Prima di poterlo utilizzare nell'interfaccia utente e accedervi dal codice sottostante, è necessario unire tale ResourceDictionary nella propria applicazione. Stai facendo questo?

In questo caso, il passaggio successivo è ottenere questa risorsa. Ogni FrameworkElement ha un metodo chiamato FindResource. Questo metodo è ottimo perché risalta l'albero ResourceDictionary e tenta di localizzare la risorsa con la chiave. Quindi, se si vuole accedere a questa risorsa da un controllo utente, è possibile effettuare le seguenti operazioni nel codice dietro:

FindResource(typeof(yourDataTemplateTargetType)); 

Se questo non funziona per voi, prego ci mostra esattamente come si dichiara questo dizionario risorse e come si confonde con le risorse dell'applicazione.

+1

Non capisco. Questa risposta non usa la chiave. –

+0

FindResource accetta un argomento, la chiave. typeof (yourDataTemplateTargetType) è la chiave in questo esempio. –

+0

Ciao. Cosa succede se la chiave non è un tipo, ma una stringa come nell'esempio di OP? –

7

Se per esempio avete un modello per pulsante nel vostro dizionario risorse nel App.xaml file che si può accedere utilizzando il seguente codice:

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

Dal Application.Current è stato nullo nel mio caso, ho finito per usare questo:

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

e quindi ottenere la chiave specificata avevo bisogno utilizzando myResourceDictionary["KeyName"] as TypeOfItem

(source)

+2

Personalmente ritengo che questo sia l'approccio migliore, come se dovessi definire questo in una libreria o ovunque, funzionerebbe ancora, dove come risposta accettata, devi unire tutti i dizionari nella tua applicazione, che potrebbe essere un eccesso, o non fattibile. –

+0

Puoi spiegare perché usare var invece di ResourceDictionary – Venkat

+0

@Venkat Ti consiglio di dare un'occhiata [qui] (http://stackoverflow.com/questions/1873873/why-does-resharper-want-to-use -var-per-tutto) e tieni presente che non è obbligatorio :-) – itsho

1

È possibile accedere a un dizionario di risorse aggiunto al progetto nel modo seguente:

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

Quindi è possibile accedere a una risorsa memorizzata nel dizionario risorse in questo modo:

someObject.Property = rd["mytemplate"]; 

NOTA:
Si dovrà modificare l'URI per il dizionario risorse in base alla posizione che si è creato è relativo al la directory di base del progetto.

0

Qualsiasi degli approcci sopra lavoro ottenendo la risorsa in base alla posizione, se si sta seguendo MVVMm io consiglierei facendo in questo modo:

  1. creare un servizio come ProvideDataTemplateService, (per creare un servizio di consueto Inherit dal comportamento)
  2. Usa il contenitore di tua scelta per iniettare questo servizio nel punto in cui desideri avere assi per DataTemple.
Problemi correlati