2010-04-12 11 views
7

Estoy intentando fusionar diccionarios de recursos wpf en el código subyacente pero por alguna razón esto no está funcionando. Si intento fusionar los diccionarios sobre el propio documento que se está ejecutando por ejemplo:Combinar diccionarios de recursos

<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> 

esto está funcionando, pero si os comento las ResourceDictionary.MergedDictionaries y en el código de prueba esto:

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

Esto se romperá porque no puede encontrar el recurso.

+1

¿Qué es "styleLocation" y "styleLocationFather"? –

Respuesta

6

No puede usar la propiedad Source para cargar un diccionario de recursos del código.

De MSDN:

"diccionarios fusionadas se puede añadir a un diccionario de recursos a través de código El valor por defecto, en un principio ResourceDictionary vacío que existe para cualquier propiedad Resources también tiene un defecto, inicialmente vacío propiedad de colección MergedDictionaries A.. agregue un diccionario combinado a través del código, obtenga una referencia al ResourceDictionary principal deseado, obtenga su valor de propiedad MergedDictionaries y llame a Add on the Collection genérico que se encuentra en MergedDictionaries. El objeto que agregue debe ser un nuevo ResourceDictionary. En el código, usted no establezca la propiedad Origen. En su lugar, debe obtener un objeto ResourceDictionary creando uno o cargando uno. forma de cargar un ResourceDictionary existente para llamar a XamlReader.Load en una secuencia de archivos XAML existente que tenga una raíz ResourceDictionary, y luego emitir el valor de retorno XamlReader.Load a ResourceDictionary ".

Por lo tanto, algunos pseudo-código:

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

Here is another example de cómo hacerlo:

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); 
Cuestiones relacionadas