あなたの用語が紛らわしいというJRotheのコメントを2番目にします。しかし、私もこれを突き刺します。
「StartScreen」のイベントで「Subpage」のメソッドを呼び出したいようです。これは、複数の「サブページ」がある場合はどうなるかという疑問を投げかけます。それらすべてを呼び出したいとしましょう。
私がお勧めする手法は、「サブページ」をグローバルデータにバインドして、任意の時点でどのビューを表示するかを学習することです。私は一般的にこれにデータバインディングを好むので、最初にそれを示します。
データバインディングを使用してこれを行う最も簡単な方法は、現在のテーマであるアプリケーションオブジェクト(またはその他の静的オブジェクト)にプロパティを設定することです。subpage.ShowTheme()を呼び出すのではなく、テーマを変更するコードは、テーマのプロパティを更新するだけです。
MyApp.Current.Theme = theme;
これで、サブページはデータバインディングを使用して、テーマをデフォルトのスタイルで独自のプロパティの1つにバインドできます。
<Style TargetType="my:Subpage">
<Setter Property="Theme" Value="{Binding Theme, Source={x:Static my:MyApp.Current}}" />
</Style>
サブページのThemeプロパティの定義で、PropertyChangedCallbackを使用してビューを更新します。
public static readonly DependencyProperty ThemeProperty = DependencyProperty.Register("Theme", typeof(MyTheme), typeof(Subpage), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((Subpage)obj).SetTheme((Theme)e.NewValue);
}
});
一般に、これはビューの変更などに最適な方法ですが、イベントを伝達したい場合もあります。通常、これは次のようなコマンドを使用して行われます。
command.Execute(null, Keyboard.FocusedElement);
ただし、これは、フォーカスがターゲット内のどこかに設定されている場合にのみ機能します。あなたの場合、コマンドを特定のウィンドウに送信したいとします。サブページコントロールが1つしかない場合は、アプリケーションオブジェクトのイベントをサブスクライブできます。
public Subpage()
{
MyApp.Current.SwitchTheme += (obj, e) => setTheme(e.NewTheme);
}
テーマ変更イベントは次のようになります。
MyApp.Current.SwitchTheme(null, new ThemeChangeEventArgs { NewTheme = theme });
繰り返しになりますが、可能であれば、データバインディング手法を使用します。