我希望使用一个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;
答案 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
<强> 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}" />