从值转换器中访问资源字典中的颜色

17

我在ResourceDictionary中定义了几个颜色,例如:

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

我希望在应用程序的任何地方都可以重复使用它们。

现在,我编写了一个值转换器来将项目的内部状态转换为相关颜色。

如何在值转换器的代码中访问定义的颜色?

我的第一个想法是将字典作为转换器参数传递。但我不知道如何实现。



敬礼

编辑

Application.Current.Resources 不可选,因为以后我将无法访问它。

1个回答

29

使用转换器参数的讨厌之处在于每次想要使用绑定时都必须添加该文本。

相反,您可以将 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>

不错。那救了我的一天。谢谢。 - DHN
2
刚看到这个 - 我也在尝试实现这个。这个解决方案不会为 ResourceDictionary 中的每个项创建一个新实例吗?或者 WPF 足够聪明,能够识别已经加载过了,并且只使用一组值? - Ross
Visual Studio 2015和2017在设计模式下会抛出一个错误: 无法将类型为“OnDemandResourceDictionary”的对象强制转换为类型“Microsoft.VisualStudio.DesignTools.Markup.DocumentModel.DocumentCompositeNode”。如何解决? - yatskovsky
@yatskovsky 我没有太多时间去挖掘/测试各种解决方案,但也许玩弄设计时资源至少可以防止它崩溃?谷歌搜索:“xaml设计时资源”。 - viggity
@viggity 谢谢你的建议。 - yatskovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接