Estoy alojando un UserControl de WPF en un contenedor WinForms. Ahora, quiero ser capaz de tema/skin el UserControl. Para hacer esto, tengo varios diccionarios de recursos que definen las "máscaras". Cuando se inicia mi aplicación, creo una "nueva aplicación System.Windows.All()" para que Application.Current exista. Para cambiar el tema, se elimina la máscara anterior y se fusiona una nueva máscara en el diccionario de recursos de nivel de aplicación en tiempo de ejecución. Sin embargo, esto no cambia ninguno de los recursos referenciados dinámicamente en el UserControl. Intenté esto en una aplicación WPF recta y funcionó bien. ¿Me estoy perdiendo algo, o no es posible hacer esto? Por cierto, si agrego un aspecto en los recursos de la aplicación antes de que se inicialice el UserControl, funcionará pero no puedo cambiar el aspecto después de eso.Los recursos dinámicos de nivel de aplicación no son dinámicos cuando se alojan en ElementHost
Para Repo esto de la manera más básica:
crear una nueva aplicación Windows Forms. Agregue un UserControl de WPF a la aplicación. Esto es bastante simple:
<UserControl ...>
<Grid>
<Button
Background="{DynamicResource ButtonBG}"/>
</Grid>
</UserControl>
Cree dos ResourceDictionaries, White.xaml y Black.xaml (o lo que sea) que tienen un SolidColorBrush con el ButtonBG clave con el color correspondiente. En Form1.cs, agregue dos botones y ElementHost. Establezca el elemento secundario de ElementHost en una instancia del UserControl que acabamos de crear. De cable hasta los botones a eventos que intercambian la piel:
private void White_Click(object sender, EventArgs e)
{
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
}
private void Black_Click(object sender, EventArgs e)
{
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\Black.xaml", UriKind.Relative)));
}
En Program.cs, asegurar que Application.Current existe y configurar la máscara inicial:
[STAThread]
static void Main()
{
new System.Windows.Application();
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
...
}
Ahora, cuando se hace clic en el botón blanco Esperaría que el botón en UserControl se ponga blanco y cuando se haga clic en el botón Negro, esperaría que el botón se ponga negro. Esto no sucede, sin embargo.
¿Alguien sabe por qué? ¿Hay una solución?
Editar: Idea: Tal vez, si hay una manera de forzar la reevaluación de DynamicResources cuando cambia el tema, eso funcionaría.
Gracias, Dusty
hello dustyburwell, ¿podría proporcionar un código de muestra, por favor? – user1912383