J'essaie de rendre mon application plus personnalisable en permettant aux utilisateurs de choisir une couleur dans une boîte de dialogue Color Picker, puis de changer le style de l'application en temps réel (avec DynamicResource
)WPF: Modification des ressources (couleurs) à partir de App.xaml pendant l'exécution
Comment faire pour changer des ressources spécifiques qui résident dans le app.xaml
?
J'ai essayé quelque chose comme ça, mais pas de chance (juste un test):
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));
Cet un extrait du fichier 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>
Quel est le meilleur façon d'autoriser cette forme de personnalisation (en changeant simplement certaines couleurs) à une application?
[Mise à jour]
Je viens de découvrir this answer d'une question précédente qui a été posée, et essayé mais je reçois le même InvalidOperationException exception Petoj mentionné dans les commentaires de la donnée répondre. Voici l'exemple de code de la réponse:
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;
Mais je ne peux pas l'ajouter dans une fenêtre parce que ce style s'applique à toutes les fenêtres de mon projet –