我将支持 J Rothe 的评论,即您的术语令人困惑。但是,我也会对此进行尝试。
在我看来,您希望“StartScreen”上的一些事件来调用“子页面”上的方法。这就引出了一个问题,如果有多个“子页面”怎么办。让我们假设您想调用它们。
我推荐的技术是您的“子页面”绑定到一些全局数据,以了解它应该在任何给定时间显示哪个视图。我通常更喜欢数据绑定,所以我将首先展示这一点。
使用数据绑定最简单的方法是在您的应用程序对象(或其他一些静态对象)中拥有一个作为当前主题的属性。任何更改主题的代码都不会调用 subpage.ShowTheme(),而是简单地更新主题属性:
MyApp.Current.Theme = theme;
现在 Subpage 可以使用数据绑定以默认样式将主题绑定到其自己的属性之一:
<Style TargetType="my:Subpage">
<Setter Property="Theme" Value="{Binding Theme, Source={x:Static my:MyApp.Current}}" />
</Style>
在 Subpage 的 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);
但这仅在焦点设置在目标内的某个位置时才有效。在您的情况下,您希望将命令发送到特定窗口。如果您只有一个子页面控件,它可以订阅应用程序对象中的事件:
public Subpage()
{
MyApp.Current.SwitchTheme += (obj, e) => setTheme(e.NewTheme);
}
和主题更改事件将是:
MyApp.Current.SwitchTheme(null, new ThemeChangeEventArgs { NewTheme = theme });
同样,如果可能的话,我会使用数据绑定技术。