2016-06-01 7 views
0

Я ищу использовать IValueConverter со значением, которое я получаю из ресурсов приложения. Я заметил, что аналогичный вопрос был задан несколько лет назад здесь: How to bind to a StaticResource with a Converter?.IValueConverter для преобразования ресурса, на который ссылается StaticResource

Однако обновление атрибута Source объекту в ресурсах не помогло мне. Мой частный случай:

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

AppThemeColor определяется и устанавливается динамически в коде позади на ранней стадии запуска приложения. Логика в конвертере просто говорит использовать цвет, если приложение не находится в режиме высокой контрастности, и в этом случае он использует кисть, поставляемую в ConverterParameter.

Кто-нибудь знает о любых подводных камнях, с которыми я мог бы столкнуться здесь? Ошибок компиляции или времени выполнения нет. Текст просто не отображается, и конвертер конвертера, похоже, не вызван.

EDIT: Некоторые спрашивали, как я динамически устанавливаю AppThemeColor. Я просто добавил следующее Однострочник здесь в OnActivatedAsync App.xaml.cs'S:

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

показать нам, где вы установите 'AppThemeColor' в коде? –

+0

Если он настроен динамически, попробовали ли вы использовать DynamicResource вместо StaticResource? –

+0

DynamicResource не является вариантом для меня в приложениях UWP (возможно, должен был уточнить, что в начале), хотя это действительно не должно быть проблемой. Я обновлю вопрос, заданный с помощью однострочного интерфейса, где я установил AppThemeColor. – evve

ответ

0

Вы можете превратить эти StaticResources в «Стиль» class для вашего приложения и назначить его на Window.DataContext.

Я думаю, что это был бы лучший подход к вашему делу.

Если ваш проект использует шаблон MVVM, создайте этот класс с использованием шаблона singleton и используйте его как свойство для ViewModel, которому нужен этот стиль.

СТИЛЬ КЛАСС:

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)); 
     } 
    } 
} 


Теперь вам нужно присвоить это к DataContext из Window

КОД:

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}" />