2016-01-21 4 views
0

У меня есть приложение 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; 
    } 
} 

Но когда я изменить тему на время выполнения, я не получаю конвертер получить удар или даже мою кисть свойства в преобразователе меняются (например: белый зеленый цвет не изменяется на черный зеленый), Так как же я могу достичь приемлемого результата.

Все остальные сценарии без преобразователей работают хорошо.

+1

Вы можете предоставить выделенный класс 'ThemeManager', в котором вы можете изменить событие при изменении текущей темы. Тогда представление может подписаться на него (подписка может быть перенесена в приложенное поведение, если вам нравится концепция MVVM) и привязки обновлений ('PropertyChanged (" ")' или переназначение DataContext'). Другого пути нет, вам нужно запускать событие «PropertyChanged» или привязывать привязки самостоятельно. Конвертер вызывается только после этого. – Sinatr

ответ

0

Вы пробовали без использования компонента DependencyObject с IValueConverter?

+0

вы можете увидеть мой код .. его уже там – VibeeshanRC

Смежные вопросы