Estoy intentando hacer que mi aplicación sea más personalizable al permitirles elegir un color desde un cuadro de diálogo Selector de color y luego cambiar el estilo de la aplicación en tiempo real (con DynamicResource
)WPF: Cambio de recursos (colores) desde App.xaml durante el tiempo de ejecución
¿Cómo hago para cambiar los recursos específicos que residen en el app.xaml
?
he intentado algo como esto, pero sin suerte (sólo una prueba):
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));
Esto muestra un extracto del archivo 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>
¿Cuál es la mejor forma de permitir esta forma de personalización (básicamente, simplemente cambiando algunos colores) a una aplicación?
[Actualización]
simplemente me encontré this answer de una pregunta anterior que se hizo, y probado, pero me estoy haciendo la misma InvalidOperationException excepción Petoj menciona en los comentarios de lo dado responder. Aquí está el código de ejemplo de la respuesta:
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;
Pero no puedo agregarlo en una ventana porque este estilo se aplica a todas las ventanas de mi proyecto –