2017-06-29 2 views
0

Angenommen, ich mache eine einfache UWP-Anwendung, die durch mehrere Seiten navigiert. Ich möchte einen gemeinsamen Hintergrund für alle Seiten haben, abhängig davon, welchen Hintergrund ein Benutzer auf der Einstellungsseite ausgewählt hat.UWP Binding: Ändern von Hintergründen in XAML mit C#

Ich habe ein SettingsPage.xaml mit einem comboBox (und Gitter-Hintergrund, die geändert werden muss):

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <ComboBox Name="ColourSelect" SelectionChanged="ComboBox_SelectionChanged"> 
     <ComboBoxItem Name="Red">Red</ComboBoxItem> 
     <ComboBoxItem Name="Green">Green</ComboBoxItem> 
     <ComboBoxItem Name="Blue">Blue</ComboBoxItem> 
    </ComboBox> 
</Grid> 

, die mit meinem SettingsPage.xaml.cs Datei-Schnittstellen:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     // Change background 
     if (Red.IsSelected) { } // Change to Red.png 
     else if (Green.IsSelected) { } // Change to Green.png 
     else if (Blue.IsSelected) { } // Change to Blue.png 
    } 

ich gesetzt habe meine App.xaml bis enthalten eine Hintergrundressource, aber ich bin mir nicht sicher, wie man es an die C# in Settings.xaml.cs bindet.

<Application.Resources> 
    <Style TargetType="Grid" x:Key="CommonBackground"> 
     <Setter Property="Background" Value="{ <!-- Some image. How to bind? --> }" 
    </Style> 
</Application.Resources> 

Was soll ich zurückgeben, um die Benutzerentscheidung an die Anwendungsressourcen zu binden?

Vielen Dank im Voraus!

+0

Warum geben Sie eine eigene Farbvorlage - wenn Sie ganze Themen von Windows 10 unterstützen können? – Peter

Antwort

1

Diese in verschiedenen Teilen der Anwendung einige Änderungen erfordert. Folge meinen Schritten.

In diesem Fall erstelle ich zwei Ressourcen. Eine, die die Einstellungen Combobox Farbschema verwaltet. Die zweite ist BitMapImage in Ressource.

Also meine Application.Resource wird etwa wie folgt aussehen.

<Application.Resources> 
    <image:BitmapImage x:Key="BackgroundSource" UriSource="ms-appx:///Assets/Red.png" /> 
    <x:String x:Key="BackgroundBrush">Red</x:String> 
</Application.Resources> 

Stellen Sie sicher, xmlns:image="using:Windows.UI.Xaml.Media.Imaging" in Ihrem App.xaml hinzufügen.

Erstellen Sie jetzt eine statische Methode in App.xaml.cs, die zur Aktualisierung Background auf die Seite während der Laufzeit verwendet wird. Es sollte so etwas wie unten sein.

public static void UpdateBGColors(string Color) 
{ 
    switch (Color) 
    { 
     case "Red": 
      Current.Resources["BackgroundSource"] = "ms-appx:///Assets/Red.png"; 
      break; 
     case "Green": 
      Current.Resources["BackgroundSource"] = "ms-appx:///Assets/Green.png"; 
      break; 
     case "Blue": 
      Current.Resources["BackgroundSource"] = "ms-appx:///Assets/Blue.png"; 
      break; 
     default: 
      Current.Resources["BackgroundSource"] = "ms-appx:///Assets/Red.png"; 
      break; 
    } 
} 

Jetzt sollte Ihre combobox_SelectionChanged wie folgt aussehen.

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ComboBox cb = sender as ComboBox; 

    ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 
    localSettings.Values["BackgroundBrush"] = (cb.SelectedValue as ComboBoxItem).Content; 
    App.UpdateBGColors((cb.SelectedValue as ComboBoxItem).Content.ToString()); 
} 

Jetzt müssen Sie BackgroundSource den Hintergrund jeder Seite auf die Ressource verkabeln. So überall Sie den Hintergrund wollen basierend auf den Einstellungen festgelegt werden hinzuzufügen unter Codezeilen

<Grid> 
    <Grid.Background> 
     <ImageBrush ImageSource="{StaticResource BackgroundSource}" /> 
    </Grid.Background> 
    ...... 
</Grid> 

An diesem Punkt, wenn Sie die Einstellung ändern Seite in Einstellung und wenn Sie zurück zur ursprünglichen Seite navigieren, die Sie kam in Einstellungsseite , Der Hintergrund sollte automatisch auf das eingestellt sein, was Sie in den Einstellungen gewählt haben.

Aber Sie möchten auch sicherstellen, dass der gleiche Hintergrund geladen wird, wenn die App das nächste Mal geöffnet wird.Um das in App.xaml.cs zu tun, fügen Sie die folgenden Zeilen am Anfang von OnLaunched Ereignis hinzu.

ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 
if (localSettings.Values["BackgroundBrush"] != null) 
{ 
    UpdateBGColors(localSettings.Values["BackgroundBrush"].ToString()); 
} 

Da in Einstellungen Seite, speichern Sie BackgroundBrush Jedesmal, wenn man die Combobox Artikel zu ändern, Jedes Mal, wenn Ihre Anwendung wird geladen, Basierend auf dem BackgroundBrushBackgroundSource wird Uri korrigieren zugewiesen und wird als Seite Backhground verwendet werden.

Voll Repo ist verfügbar Here

Good Luck.

0

[Update] Sie können dies verwenden, und nach dem Speichern Ihrer Einstellungen.

SettingsPage.xaml

<Grid> 
    <Grid.Background> 
     <ImageBrush x:Name="colorImage" Stretch="UniformToFill"/> 
    </Grid.Background> 
    <ComboBox Name="ColourSelect" SelectionChanged="ComboBox_SelectionChanged"> 
     <ComboBoxItem Name="Red">Red</ComboBoxItem> 
     <ComboBoxItem Name="Green">Green</ComboBoxItem> 
     <ComboBoxItem Name="Blue">Blue</ComboBoxItem> 
    </ComboBox> 
</Grid> 

SettingsPage.xaml.cs

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (Red.IsSelected) 
     { 
      ChangeColorImage("ms-appx:///Assets/Red.png"); 
     } 
     else if (Green.IsSelected) 
     { 
      ChangeColorImage("ms-appx:///Assets/Green.png"); 
     } 
     else if (Blue.IsSelected) 
     { 
      ChangeColorImage("ms-appx:///Assets/Blue.png"); 
     } 
    } 

    private void ChangeColorImage(string imageUrl) 
    { 
     // using Windows.UI.Xaml.Media.Imaging; 
     BitmapImage imageSource = new BitmapImage(new Uri(imageUrl)); 
     colorImage.ImageSource = imageSource; 
    }