この問題の解決策に苦労している人のために: カスタム スタイルをすべての Window 派生型に自動的に適用するにはどうすればよいですか? 以下は私が思いついた解決策です
注: Window タイプから派生させたり、各ウィンドウに XAML を挿入してスタイルの更新を強制したりする必要はありませんでした。これは、私のプロジェクトに固有の理由によるものです (私の製品の消費者は、私の一般的な再利用可能なスタイル ライブラリを使用し、独自のスタイル ライブラリを作成します)。レイアウト/ウィンドウなど) だから、どんな副作用があっても喜んで生きていける、うまくいく解決策を見つけることに本当にやる気がありました
インスタンス化されたすべてのウィンドウを繰り返し処理し、ウィンドウ タイプに対して定義した新しいカスタム スタイルを強制的に使用する必要があります。これは、すでに起動しているウィンドウにはうまく機能しますが、ウィンドウまたは子ウィンドウがインスタンス化されると、その基本型に対して宣言された新しい/カスタム型を使用することを認識しません。バニラ ウィンドウ タイプ。したがって、私が思いついた最善の方法は、MainWindow で LostKeyBoardFocus を使用して、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);
}
}