在WPF应用程序中使用Resources.resx来设置颜色

时间:2011-03-18 14:43:56

标签: wpf mvvm

我正在尝试创建一个必须能够轻松更改可能会改变应用程序颜色的dll文件的应用程序。 我正在尝试使用资源管理器来执行此操作,但是在设置颜色值时遇到问题,以便视图的样式可以轻松接受它。 我们知道(在这种情况下)按钮的背景采用SolidColorBrush,而

Value="Black"有效,
Value={x:Static res:AppResources.Btn_Background}

给出字符串Black没有(当前的理论是转换器使前者工作但后者不工作)。 这一切都在wpf& MVVM。 你们有没有想过如何做到这一点。

问候

3 个答案:

答案 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