C# 从值转换器访问资源字典中的颜色
我在一本词典中定义了几种颜色。e、 g:C# 从值转换器访问资源字典中的颜色,c#,wpf,silverlight,C#,Wpf,Silverlight,我在一本词典中定义了几种颜色。e、 g: <ResourceDictionary ...> <Color x:Key=Gray1>#FFF7F1F3</Color> <Color x:Key=Gray2>#FFDDD8DA</Color> </ResourceDictionary> #FFF7F1F3 #FFDDD8DA </ResourceDictionary> 因此,我可以在应用程序的任何地方重用它们 现在,我编写了一个
<ResourceDictionary ...>
<Color x:Key=Gray1>#FFF7F1F3</Color>
<Color x:Key=Gray2>#FFDDD8DA</Color>
</ResourceDictionary>
#FFF7F1F3
#FFDDD8DA
</ResourceDictionary>
因此,我可以在应用程序的任何地方重用它们
现在,我编写了一个值转换器,将项目内部状态转换为相关颜色
如何访问值转换器代码中定义的颜色
我的第一个想法是将字典作为转换器参数传递。但我不知道如何做到这一点
问候 编辑
Application.Current.Resources
不是一个选项。因为我以后将无法访问它。使用转换器参数的恼人之处在于每次使用绑定时都必须添加该文本
相反,您可以将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>
实例化并使用转换器:
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>
...
不错。这救了我一天。谢谢。我刚刚遇到了这个——我也在努力实现这个目标。此解决方案是否不会为ResourceDictionary中的每个项创建新实例?或者WPF是否足够聪明,可以识别它已经加载,并且只使用一组值?Visual Studio 2015和2017在设计模式中抛出一个错误:无法将类型为“OnDemandResourceDictionary”的对象强制转换为类型为“Microsoft.VisualStudio.DesignTools.Markup.DocumentModel.DocumentCompositeNode”。如何打败它?@yatskovsky我没有太多时间去挖掘/测试各种解决方案,但也许弄乱设计时资源至少可以防止它崩溃?谷歌这个:“xaml设计时资源”@viggity谢谢你的想法。