Para aquellos que luchan con esto una solución al problema: ¿Cómo puedo tener un estilo personalizado puede aplicar a todos mis automtically Tipos de ventana derivada? A continuación se muestra la solución que se me ocurrió
NOTA: Realmente no quería derivarme del tipo Ventana o tengo que insertar XAML en cada ventana para forzar una actualización de estilo, etc.por razones específicas de mi proyecto (los consumidores de mi producto usamos nuestra biblioteca genérica de estilo reutilizable y creamos su propio diseño/ventanas, etc.), así que realmente estaba motivado para encontrar una solución que funcionase que estaba dispuesto a vivir con cualquier lado efectos
Necesitar iterar a través de todas las ventanas instanciadas y simplemente forzarlas a usar el nuevo estilo personalizado que ha definido para el tipo de Ventana. Esto funciona muy bien para las ventanas que ya están abiertas, pero cuando se crea una instancia de una ventana o una ventana secundaria, no sabrá usar el tipo nuevo/personalizado que se ha declarado para su tipo base; el tipo de ventana vainilla. Así que lo mejor que se me ocurrió fue utilizar LostKeyBoardFocus en MainWindow para cuando pierde Focus to a ChildWindow (IOW cuando se ha creado una ventana hija) y luego invocar este FixupWindowDerivedTypes().
Si alguien tiene una mejor solución para "detectar" cuando cualquier tipo de tipo derivado de la ventana se crea una instancia y, por lo tanto, llama a los FixupWindowDerivedTypes() que sería genial. Puede haber algo útil al manejar WM_WINDOWPOSCHANGING en esta área también.
De modo que esta solución no es elegante por decir, pero hace el trabajo sin tener que tocar ningún código o XAML relacionado con mis ventanas.
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);
}
}
Sí, me encontré con el mismo problema. Gishu dijo anteriormente que parece que el estilo implícito para Windows no se aplicará a su ventana, ya que en realidad es una clase derivada. –