2010-07-13 10 views
16

Я определил несколько цветов в ResourceDictionary. например:Доступ к цветам в словаре ресурсов из преобразователя значений

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

Поэтому я могу использовать их везде в приложении.

Теперь я написал преобразователь значений, чтобы преобразовать внутреннее состояние элементов в соответствующий цвет.

Как я могу получить доступ к определенным цветам в коде преобразователя значений?

Моей первой мыслью было передать словарь в качестве параметра преобразователя. Но я не знаю, как этого добиться.



С уважением

EDIT

Application.Current.Resources не вариант. Потому что у меня не будет доступа к нему позже.

ответ

25

Досадная вещь об использовании параметра преобразователя заключается в том, что вы должны добавлять этот текст каждый раз, когда хотите использовать привязку.

Вместо этого вы можете сделать ресурс ResourceDictionary своим конвертером и установить его при создании экземпляра конвертера.

код преобразователя:

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(); 
    } 

} 

экземпляры и использовать преобразователь:

<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

Nice один. Это спасает мой день. Благодарю. – DHN

+2

Только что наткнулся на это - я тоже пытаюсь добиться этого. Разве это решение не создает новый экземпляр каждого элемента в ResourceDictionary? Или WPF достаточно умен, чтобы признать, что он уже загружен, и использовать только один набор значений? – Ross

+0

Visual Studio 2015 & 2017 выдает ошибку в режиме разработки: Невозможно наложить объект типа «OnDemandResourceDictionary» на тип «Microsoft.VisualStudio.DesignTools.Markup.DocumentModel.DocumentCompositeNode». Как победить? – yatskovsky