我正在尝试创建一个必须能够轻松更改可能会改变应用程序颜色的dll文件的应用程序。 我正在尝试使用资源管理器来执行此操作,但是在设置颜色值时遇到问题,以便视图的样式可以轻松接受它。 我们知道(在这种情况下)按钮的背景采用SolidColorBrush,而
Value="Black"
有效,
Value={x:Static res:AppResources.Btn_Background}
给出字符串Black
没有(当前的理论是转换器使前者工作但后者不工作)。
这一切都在wpf& MVVM。
你们有没有想过如何做到这一点。
问候
答案 0 :(得分:2)
您可以使用Binding
:
Background="{Binding Source={x:Static res:AppResources.Btn_Background}}"
这会导致CoerceValue
触发控制背景的DependencyProperty
。
@Snowbear提到它可能是Color
而不是String
,在这种情况下,您需要提供一个微不足道的IValueConverter
。
public class ColorConverter: IValueConverter
{
#region IValueConverter Members
private Dictionary<Color, Brush> brushes = new Dictionary<Color, Brush>();
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
Brush brush;
var color = (Color)value;
if (!brushes.TryGetValue(color, out brush))
{
brushes[color] = brush = new SolidColorBrush(color);
brush.Freeze();
}
return brush;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
答案 1 :(得分:1)
您的具体问题是您绕过了刷子转换的默认字符串,需要手动处理。
正如六个变量所述,如果你的源是一个字符串,你可以使用Binding,但这可能是矫枉过正。至少,您需要在Binding上设置Mode = OneTime。
您还可以创建执行转化的custom MarkupExtension。
无论是通过自定义IValueConverter还是MarkupExtension,您的转换都可以利用BrushConverter类。因此,像“黑色”或“#000”这样的东西可以像在第一个例子中那样在XAML中定义颜色时起作用。
编辑:
实际上,从StaticExtension派生的标记扩展使这更容易:
public class BrushStaticExtension : StaticExtension {
private static BrushConverter converter = new BrushConverter();
public BrushStaticExtension() { }
public BrushStaticExtension(string member) : base (member) { }
public override object ProvideValue(IServiceProvider serviceProvider) {
return converter.ConvertFrom(base.ProvideValue(serviceProvider));
}
}
答案 2 :(得分:0)
如果指定字符串,则XAML解析器使用字符串转换器自动创建SolidColorBrush
。据我所知,目前Btn_Background
资源为Color
,但它应该是SolidColorBrush
。