У меня есть приложение WPF, которое поддерживает несколько цветовых схем (я достигаю этого путем замены файлов Black.Xaml и White.XAML во время выполнения, где у обоих есть кисти с одним и тем же ключом, а затем доступ к ним с помощью DynamicResources).WPF Темы и конвертеры
Теперь я должен показать Red для значений ниже 0 и зеленый для значений выше 0. (у меня разные зеленые и красные для каждой темы). Так что мой конвертер идет как это
XAML
<Converters:PositiveNegativeConverter x:Key="PositiveNegativeConverter" DownColor="{DynamicResource RedPrimaryBrush}" UpColor="{DynamicResource GreenPrimaryBrush}" NormalColor="{DynamicResource BluePrimaryBrush}"/>
Преобразователь
public class PositiveNegativeConverter : DependencyObject, IValueConverter
{
#region DependencyProperty
public SolidColorBrush UpColor
{
get { return (SolidColorBrush)GetValue(UpColorProperty); }
set { SetValue(UpColorProperty, value); }
}
// Using a DependencyProperty as the backing store for UpColor. This enables animation, styling, binding, etc...
public static readonly DependencyProperty UpColorProperty =
DependencyProperty.Register("UpColor", typeof(SolidColorBrush), typeof(PositiveNegativeConverter), new PropertyMetadata(null));
public SolidColorBrush DownColor
{
get { return (SolidColorBrush)GetValue(DownColorProperty); }
set { SetValue(DownColorProperty, value); }
}
// Using a DependencyProperty as the backing store for DownColor. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DownColorProperty =
DependencyProperty.Register("DownColor", typeof(SolidColorBrush), typeof(PositiveNegativeConverter), new PropertyMetadata(null));
public SolidColorBrush NormalColor
{
get { return (SolidColorBrush)GetValue(NormalColorProperty); }
set { SetValue(NormalColorProperty, value); }
}
// Using a DependencyProperty as the backing store for NormalColor. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NormalColorProperty =
DependencyProperty.Register("NormalColor", typeof(SolidColorBrush), typeof(PositiveNegativeConverter), new PropertyMetadata(null));
#endregion
#region IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
{
double dblValue = (double)value;
if (dblValue > 0)
{
return UpColor;
}
else if (dblValue < 0)
{
return DownColor;
}
}
return NormalColor;
}
}
Но когда я изменить тему на время выполнения, я не получаю конвертер получить удар или даже мою кисть свойства в преобразователе меняются (например: белый зеленый цвет не изменяется на черный зеленый), Так как же я могу достичь приемлемого результата.
Все остальные сценарии без преобразователей работают хорошо.
Вы можете предоставить выделенный класс 'ThemeManager', в котором вы можете изменить событие при изменении текущей темы. Тогда представление может подписаться на него (подписка может быть перенесена в приложенное поведение, если вам нравится концепция MVVM) и привязки обновлений ('PropertyChanged (" ")' или переназначение DataContext'). Другого пути нет, вам нужно запускать событие «PropertyChanged» или привязывать привязки самостоятельно. Конвертер вызывается только после этого. – Sinatr