1

ねえ、私はWPFアプリケーションを実行しています。

ツリーは次のようになります。

SurfaceWindow---スタート画面
..........................--------ページ----------サブページ

Startscreen(Startscreen.xaml.cs)の「CodeBehind」の「Subpage」からメソッドを呼び出そうとしています。

サブページのメソッドは次のようになります。

public void showTheme(ThemeViewModel theme){...}

「Page」または「SurfaceWindow」にいるときに呼び出すことができることがわかっている場合は、ツリーの同じ「ブランチ」にあるため、次のようにします。

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

しかし、ツリーの同じブランチにいないときにメソッドを呼び出したい場合は、どうすればよいですか?

4

2 に答える 2

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 に答える
1

あなたの用語が紛らわしいという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 });

繰り返しになりますが、可能であれば、データバインディング手法を使用します。

于 2010-05-12T21:34:17.393 に答える