2016-06-01 16 views
0

Ich suche einen IValueConverter mit einem Wert, den ich von den Ressourcen einer Anwendung bekomme. Ich habe festgestellt, dass vor ein paar Jahren eine ähnliche Frage gestellt wurde: How to bind to a StaticResource with a Converter?.IValueConverter zum Konvertieren einer von StaticResource referenzierten Ressource

Das Aktualisieren des Source-Attributs zu einem Objekt in den Ressourcen funktionierte jedoch nicht für mich. Mein besonderer Fall:

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

Die AppThemeColor definiert und dynamisch in der Code-behind in einem frühen Stadium des App-Starts gesetzt. Die Logik im Konverter sagt lediglich, dass die bereitgestellte Farbe verwendet wird, es sei denn, die App befindet sich im Hochkontrast-Modus. In diesem Fall wird der im ConverterParameter angegebene Pinsel verwendet.

Kennt jemand irgendwelche Fallstricke, die ich hier laufen könnte? Es gibt keine Kompilierungs- oder Laufzeitfehler. Der Text erscheint einfach nicht und der Konvertierer des Konverters scheint nicht aufgerufen zu werden.

EDIT: Einige Fragen, wie ich die AppThemeColor dynamisch festlegen. Ich habe einfach die folgenden Einzeiler hier im App.xaml.cs der OnActivatedAsync:

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

uns, wo Sie die 'AppThemeColor' im Code festgelegt? –

+0

Wenn es dynamisch eingestellt ist, haben Sie versucht, DynamicResource anstelle von StaticResource zu verwenden? –

+0

DynamicResource ist keine Option für mich in UWP-Apps (vielleicht hätte ich das am Anfang geklärt), aber das sollte eigentlich nicht das Problem sein. Ich werde die Frage aktualisieren, die ich mit dem Einzeiler gestellt habe, wo ich die AppThemeColor eingestellt habe. – evve

Antwort

0

Sie diese StaticResources verwandeln kann in einen „Style“ class für Ihre App und weist es die Window.DataContext.

Ich denke, das wäre der beste Ansatz für Ihren Fall.

Wenn Ihr Projekt verwendet MVVM Muster, erstellen Sie diese Klasse mit singleton Muster und verwenden Sie es als eine Eigenschaft für Ihr ViewModel, die diesen Stil benötigen.

Artklasse:

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


Jetzt müssen Sie dies die des Window

CODE Datacontext zuzuordnen:

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