Sto cercando di rendere la mia applicazione più personalizzabile consentendo agli utenti di selezionare un colore da una finestra di dialogo Color Picker e quindi di modificare lo stile dell'applicazione in tempo reale (con DynamicResource
)WPF: modifica delle risorse (colori) da App.xaml durante il runtime
Come faccio a cambiare risorse specifiche che risiedono nello app.xaml
?
ho provato qualcosa di simile, ma senza fortuna (solo una prova):
var colorDialog = new CustomControls.ColorPickerDialog();
var dResult = colorDialog.ShowDialog();
var x = Application.Current.Resources.Values.OfType<LinearGradientBrush>().First();
x = new LinearGradientBrush();
x.GradientStops.Add(new GradientStop(colorDialog.SelectedColor,1));
Questo un estratto del file app.xaml
:
<Application.Resources>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="HeaderBackground">
<GradientStop Color="#82cb02" Offset="1"/>
<GradientStop Color="#82cb01" Offset="0.2"/>
<GradientStop Color="#629a01" Offset="0.5"/>
</LinearGradientBrush>
Qual è la migliore modo per consentire questa forma di personalizzazione (in pratica solo cambiando alcuni colori) a un'applicazione?
[Update]
Ho appena trovato this answer da una domanda precedente che è stato chiesto, e l'ho provato, ma io sono sempre lo stesso InvalidOperationException eccezione Petoj citato nei commenti per la data risposta. Ecco il codice di esempio dalla risposta:
Xaml:
<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" >
<GradientBrush.GradientStops>
<GradientStop Color="Blue" Offset="0" />
<GradientStop Color="Black" Offset="1" />
</GradientBrush.GradientStops>
</LinearGradientBrush>
C#:
LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush.GradientStops[0].Color = Colors.Red;
Ma non posso aggiungerlo in una finestra perché questo stile si applica a tutte le finestre del mio progetto –