IValueConverter转换StaticResource引用的资源

时间:2016-06-01 20:13:38

标签: wpf xaml staticresource

我希望使用一个IValueConverter,它具有我从应用程序资源中获取的值。我注意到几年前在这里问了一个类似的问题:How to bind to a StaticResource with a Converter?

但是,将Source属性更新为资源中的对象并不适合我。我的具体案例:

<TextBlock Text="SampleText" Foreground="{Binding Source={StaticResource AppThemeColor}, Converter={StaticResource ThemeColorToBrushConverter}, ConverterParameter={StaticResource ApplicationForegroundThemeBrush}, Mode=OneWay}" />

在应用程序启动的早期阶段,AppThemeColor在后面的代码中动态定义和设置。转换器中的逻辑只是说使用提供的颜色,除非应用程序处于高对比度模式,在这种情况下它使用ConverterParameter中提供的画笔。

有谁知道我可能遇到的任何陷阱?没有编译或运行时错误。文本没有出现,转换器的转换似乎没有被调用。

编辑:有人问我是如何动态设置AppThemeColor的。我只是在App.xaml.cs的OnActivatedAsync中添加了以下单行:

Application.Current.Resources[AppThemeColorResourceKey] = (themeExists) ? branding.ThemeColor : blueThemeColor;

1 个答案:

答案 0 :(得分:0)

您可以将这些 StaticResources 转换为您应用的“样式”class,并将其分配给Window.DataContext

我认为这将是您案件的最佳方法。

如果您的项目使用 MVVM 模式,请使用singleton模式创建该类,并将其用作需要该样式的ViewModel的属性。

STYLE CLASS:

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Media;

public class DefaultStyleClass : INotifyPropertyChanged
{
    private Brush _appThemeColor;
    public Brush AppThemeColor
    {
        get { return _appThemeColor; }
        set
        {
            if(value != _appThemeColor)
            {
                _appThemeColor = value;
                NotifyPropertyChanged();
            }
        }
    }

    public DefaultStyleClass()
    {
        AppThemeColor = Brushes.Red;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var propertyChanged = PropertyChanged;
        if (propertyChanged != null)
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}


现在您需要将其分配给Window

DataContext

<强> CODE:

public DefaultStyleClass StyleContext;
public MainWindow()
{
    InitializeComponent();

    StyleContext = new DefaultStyleClass();
    DataContext = StyleContext;
}


ON XAML:

<TextBlock Text="SampleText",
           Foreground="{Binding AppThemeColor},
           Converter={StaticResource ThemeColorToBrushConverter},
           ConverterParameter={StaticResource ApplicationForegroundThemeBrush},
           Mode=OneWay}" />