2010-04-12 12 views
7

Sto cercando di unire i dizionari delle risorse wpf sul codice, ma per alcune ragioni questo non funziona. Se provo unire i dizionari nel documento stesso è in esecuzione, per esempio:Unione di risorse Dizionari

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:WpfApplication212;assembly=WpfApplication212"> 

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Theme.xaml"></ResourceDictionary> 
</ResourceDictionary.MergedDictionaries> 

<Style TargetType="{x:Type local:URComboBox}" BasedOn="{StaticResource ComboBoxStyle}"> 
</Style> 

Questo è il lavoro, ma se io commento le ResourceDictionary.MergedDictionaries e nel codice provo questo:

ResourceDictionary skin = new ResourceDictionary(); 
skin.Source = styleLocation; 
ResourceDictionary skinFather = new ResourceDictionary(); 
skinFather.MergedDictionaries.Add(skin); 
skinFather.Source = styleLocationFather; 

Questo si interrompe perché non è possibile trovare la risorsa.

+1

ciò che è "styleLocation" e "styleLocationFather"? –

risposta

6

Non è possibile utilizzare la proprietà Origine per caricare un dizionario di risorse dal codice.

Da MSDN:

"dizionari uniti possono essere aggiunti a un dizionario risorse tramite codice L'impostazione di default, inizialmente ResourceDictionary vuoto che esiste per ogni proprietà risorse ha anche un valore predefinito, inizialmente vuota proprietà MergedDictionaries collezione.. aggiungi un dizionario unito tramite codice, ottieni un riferimento al ResourceDictionary primario desiderato, ottieni il valore della proprietà MergedDictionaries e chiama Add sulla raccolta generica contenuta in MergedDictionaries. L'oggetto che aggiungi deve essere un nuovo ResourceDictionary. non impostare la proprietà Source. Al contrario, è necessario ottenere un oggetto ResourceDictionary creando uno o caricandone uno modo per caricare un ResourceDictionary esistente per chiamare XamlReader.Load su un flusso di file XAML esistente che abbia una radice ResourceDictionary, quindi lanciare il valore di ritorno di XamlReader.Load su ResourceDictionary. "

Quindi, alcuni pseudo codice:

ResourceDictionary myResourceDictionary = XamlReader.Load(someXamlStreamReader); 
anotherResourceDictionary.MergedDictionaries.Add(myResourceDictionary); 

Here is another example di come farlo:

Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative); 
StreamResourceInfo info = Application.GetResourceStream(uri); 
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader(); 
Page page = (Page)reader.LoadAsync(info.Stream);