Come posso accedere a ResourceDictionary in wpf dal codice C #?
Domanda
Ho un DataTemplate
definito in un file xaml a cui voglio accedere tramite il 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:
<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 assegnarlo alla sua proprietà Itemtemplate
ma non capisco come posso farlo?
Soluzione
Dove lo stai definendo esattamente?
Se lo definisci nel ResourceDictionary del tuo oggetto, quindi
Application.Current.Resources[typeof(yourDataTemplateTargetType)]
dovrebbe funzionare. Se lo stai definendo come membro di qualcos'altro, ad esempio, 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 file. Prima di poterlo utilizzare nella tua UI e accedervi dal tuo codice, devi unire ResourceDictionary nella tua applicazione. Lo stai facendo?
Se lo sei, il passaggio successivo è ottenere questa risorsa. Ogni FrameworkElement ha un metodo chiamato FindResource . Questo metodo è eccezionale perché percorre l'albero ResourceDictionary e tenta di individuare la risorsa con la chiave. Pertanto, se si desidera accedere a questa risorsa da un UserControl, è possibile effettuare le seguenti operazioni nel codice sottostante:
FindResource(typeof(yourDataTemplateTargetType));
Se questo non funziona per te, ti preghiamo di mostrarci esattamente come stai dichiarando questo dizionario delle risorse e come viene unito alle risorse della tua applicazione.
Altri suggerimenti
Dato che Application.Current
era 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 di cui avevo bisogno utilizzando
myResourceDictionary [" KeyName "] come TypeOfItem
( source )
Se ad esempio hai un modello per Button nel dizionario delle risorse nel file App.xaml, puoi accedervi utilizzando il seguente codice:
Application.Current.Resources[typeof(Button)]
Puoi accedere a un dizionario delle risorse che hai aggiunto al tuo progetto come segue:
var rd = new ResourceDictionary();
rd.Source = new Uri("ms-appx:///Dictionary1.xaml");
Quindi puoi accedere a una risorsa memorizzata nel dizionario delle risorse in questo modo:
someObject.Property = rd["mytemplate"];
Nota:
Dovrai modificare l'URI nel dizionario delle risorse in base alla posizione che hai creato in relazione alla directory di base del progetto.
Uno qualsiasi degli approcci sopra funziona per ottenere la risorsa in base alla posizione, se stai seguendo MVVMm ti consiglierei di farlo in questo modo:
- crea un servizio come ProvideDataTemplateService, (per creare un servizio usualmente ereditato da Behavior)
- Usa il contenitore di tua scelta per iniettare questo servizio dove desideri avere assi su DataTemple.