1

嘿,我正在做一个 WPF 应用程序。

树看起来像这样:

SurfaceWindow --- 开始屏幕 ......--------
页面----------子页面

我正在尝试从 Startscreen(Startscreen.xaml.cs)的“代码隐藏”中的“子页面”调用一个方法。

子页面中的方法如下所示:

public void showTheme(ThemeViewModel 主题) { ... }

如果知道当我在“Page”或“SurfaceWindow”上时可以调用它,因为它在树的同一个“分支”中,我只是做这样的事情:

        ThemeViewModel theme = (ThemeViewModel)mvm.CurrentItem.ThemeViewModel;
        katalog.katalogblatt.showTheme(theme);

但是当我不在树的同一个分支上并且想要调用该方法时,我该怎么做呢?

4

2 回答 2

1

我将支持 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 });

同样,如果可能的话,我会使用数据绑定技术。

于 2010-05-12T21:34:17.393 回答
1

你能提供更多细节吗?你的术语可能意味着各种各样的东西。如果您的意思是您想在父控件之外的名为“katalogBlatt”的控件上调用一个名为“showTheme”的方法,那么您需要在父控件上公开一个方法来调用子控件方法:

public void ShowTheme(ThemeViewModel theme)
{
   this.katalogBlatt.ShowTheme(theme)
}

并将其称为:

page.ShowTheme(theme)

或者您需要将控件公开为父级的公共属性:

public <controlType> Catalog
{
   get
   {
      return katalogBlatt;
   }
}

并将其称为:

page.Catalog.ShowTheme(theme);
于 2010-05-12T14:36:53.073 回答