2010-07-13 13 views
16

Definí varios colores en un ResourceDictionary. e.g .:Acceso a los colores en un diccionario de recursos de un convertidor de valor

<ResourceDictionary ...> 
    <Color x:Key=Gray1>#FFF7F1F3</Color> 
    <Color x:Key=Gray2>#FFDDD8DA</Color> 
</ResourceDictionary>

Entonces puedo reutilizarlos en todas partes en la aplicación.

Ahora escribí un convertidor de valor para convertir el estado interno de los elementos al color relacionado.

¿Cómo puedo acceder a los colores definidos en el código del convertidor de valor?

Mi primer pensamiento fue pasar el diccionario como parámetro de conversión. Pero no sé cómo lograr eso.



Saludos

EDIT

Application.Current.Resources no es una opción. Porque no tendré acceso a eso más tarde.

Respuesta

25

Lo molesto de usar un parámetro de convertidor es que tiene que agregar ese texto cada vez que quiera usar el enlace.

En su lugar, puede hacer que ResourceDictionary sea una propiedad en su convertidor y configurarlo cuando cree una instancia del convertidor.

código

para convertidor:

public class SomeConverter : IValueConverter 
{ 
    private ResourceDictionary _resourceDictionary; 
    public ResourceDictionary ResourceDictionary 
    { 
     get { return _resourceDictionary; } 
     set 
     { 
      _resourceDictionary = value; 
     } 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //do your own thing using the _dict 
     //var person = value as Person 
     //if (person.Status == "Awesome") 
     // return _resourceDictionary["AwesomeBrush"] 
     //else 
     // return _resourceDictionary["NotAwesomeBrush"]; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

} 

instantiate y el uso del convertidor:

<Window.Resources> 
    <local:SomeConverter x:Key="MyConverter" > 
     <local:SomeConverter.ResourceDictionary> 
      <ResourceDictionary Source="SomeRandomResourceDictionary.xaml" /> 
     </local:SomeConverter.ResourceDictionary> 
    </local:SomeConverter> 
</Window.Resources> 

... 

<StackPanel Background="{Binding CurrentPerson, Converter={StaticResource MyConverter}}" > 
</StackPanel> 
+0

uno de los buenos. Eso me salva el día. Gracias. – DHN

+2

Acabo de enterarme de esto. Estoy tratando de lograr esto también. ¿Esta solución no crea una nueva instancia de cada elemento en el ResourceDictionary? ¿O es WPF lo suficientemente inteligente como para reconocer que ya se ha cargado y para usar solo un conjunto de valores? – Ross

+0

Visual Studio 2015 & 2017 arroja un error en el modo de diseño: No se puede convertir el objeto de tipo 'OnDemandResourceDictionary' para escribir 'Microsoft.VisualStudio.DesignTools.Markup.DocumentModel.DocumentCompositeNode'. ¿Cómo vencerlo? – yatskovsky

Cuestiones relacionadas