Для тех, кто борется с решением проблемы: как можно автоматически применить собственный стиль ко всем типам, производным от Window? Ниже приведено решение, которое я придумал
ПРИМЕЧАНИЕ. Я действительно не хотел наследовать от типа Window или вставлять XAML в каждое окно для принудительного обновления стиля и т. Д. По причинам, характерным для моего проекта (потребители моего продукта использовали мою универсальную библиотеку стилей многократного использования и создать свой собственный макет / окна и т. д.), поэтому я был действительно мотивирован , чтобы найти решение, которое сработало, что я был готов жить с любыми побочными эффектами
Необходимо пройти через все экземпляры окон и просто заставить их использовать новый пользовательский стиль, который вы определили для типа окна. Это прекрасно работает для окон, которые уже открыты, но когда создается экземпляр окна или дочернего окна, он не будет знать, использовать ли новый / пользовательский тип, который был объявлен для его базового типа; Тип ванильного окна. Поэтому лучшее, что я мог придумать, - это использовать LostKeyBoardFocus в MainWindow для случая, когда он теряет Focus для ChildWindow (IOW, когда дочернее окно создано), а затем вызывать этот FixupWindowDerivedTypes ().
Если у кого-то есть лучшее решение для «обнаружения», когда создается экземпляр любого типа производного от окна, и, таким образом, вызовет FixupWindowDerivedTypes (), это было бы здорово. В этой области может быть что-то полезное и для обработки WM_WINDOWPOSCHANGING.
Так что это решение не элегантно, так сказать, но оно выполняет свою работу без необходимости касаться какого-либо кода или XAML, связанных с моими окнами.
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);
}
}