Pour ceux qui sont à la recherche d'une solution au problème suivant : comment puis-je faire en sorte qu'un style personnalisé soit automatiquement appliqué à tous mes types dérivés de fenêtres ? Voici la solution que j'ai trouvée
NOTE : Je ne voulais vraiment pas dériver du type Window ou avoir à insérer XAML sur chaque fenêtre pour forcer une mise à jour du style, etc. pour des raisons spécifiques à mon projet (les consommateurs de mon produit utilisent ma bibliothèque de style générique réutilisable et créent leur propre mise en page/fenêtres, etc. motivé de trouver une solution qui fonctionne et que j'étais prêt à vivre avec les effets secondaires.
Il faut itérer à travers toutes les fenêtres instanciées et les forcer à utiliser le nouveau style personnalisé que vous avez défini pour le type de fenêtre. Cela fonctionne très bien pour les fenêtres qui sont déjà en place, mais lorsqu'une fenêtre ou une fenêtre enfant est instanciée, elle ne sait pas qu'elle doit utiliser le nouveau type personnalisé qui a été déclaré pour son type de base, le type vanilla Window. Le mieux que j'ai pu faire est donc d'utiliser la fonction LostKeyBoardFocus de la fenêtre principale lorsqu'elle perd le focus au profit d'une fenêtre enfant (c'est-à-dire lorsqu'une fenêtre enfant a été créée), puis d'invoquer la fonction FixupWindowDerivedTypes().
Si quelqu'un a une meilleure solution pour "détecter" quand un type dérivé de fenêtre est instancié et ainsi appeler la fonction FixupWindowDerivedTypes(), ce serait génial. La gestion du WM_WINDOWPOSCHANGING pourrait également s'avérer utile dans ce domaine.
Cette solution n'est donc pas élégante en soi, mais elle permet de faire le travail sans que je doive toucher au code ou au XAML de mon Windows.
public static void FixupWindowDerivedTypes()
{
foreach (Window window in Application.Current.Windows)
{
//May look strange but kindly inform each of your window derived types to actually use the default style for the window type
window.SetResourceReference(FrameworkElement.StyleProperty, DefaultStyleKeyRetriever.GetDefaultStyleKey(window));
}
}
}
}
//Great little post here from Jafa to retrieve a protected property like DefaultStyleKey without using reflection.
http://themechanicalbride.blogspot.com/2008/11/protected-dependency-properties-are-not.html
//Helper class to retrieve a protected property so we can set it
internal class DefaultStyleKeyRetriever : Control
{
/// <summary>
/// This method retrieves the default style key of a control.
/// </summary>
/// <param name="control">The control to retrieve the default style key
/// from.</param>
/// <returns>The default style key of the control.</returns>
public static object GetDefaultStyleKey(Control control)
{
return control.GetValue(Control.DefaultStyleKeyProperty);
}
}