web-dev-qa-db-ja.com

WindowsストアアプリでMainPageの現在のインスタンスにアクセスする最良の方法は?

C#Windowsストアアプリの別のクラスからメインページの現在のインスタンスにアクセスするにはどうすればよいのでしょうか。

具体的には、SurfaceのWindowsストアアプリでRTタブレット(つまり、RT APIに限定))他のクラスのメインページメソッドとUI要素にアクセスしたい。

新しいインスタンスの作成は、次のように機能します。

MainPage mp = new MainPage();
mp.PublicMainPageMethod();
mp.mainpageTextBlock.Text = "Setting text at runtime";

メソッド/ UI要素を公開するという点で、これは適切な手順ではありません。

他のクラスから、実行時にメインページのメソッドにアクセスしてUI要素を変更するためのベストプラクティスは何ですか?これに関するWindowsPhoneの記事はいくつかありますが、WindowsRTについては何も見つからないようです。

17
Danny Johnson

MVVMを使用している場合は、Messengerクラスを使用できます。

MainWindow.xaml:

using GalaSoft.MvvmLight.Messaging;

public MainWindow()
{
    InitializeComponent();
    this.DataContext = new MainViewModel();
    Messenger.Default.Register<NotificationMessage>(this, (nm) =>
    {
        //Check which message you've sent
        if (nm.Notification == "CloseWindowsBoundToMe")
        {
            //If the DataContext is the same ViewModel where you've called the Messenger
            if (nm.Sender == this.DataContext)
                //Do something here, for example call a function. I'm closing the view:
                this.Close();
        }
    });
}

また、ViewModelでは、いつでもメッセンジャーを呼び出したり、ビューに通知したりできます。

Messenger.Default.Send<NotificationMessage>(new NotificationMessage(this, "CloseWindowsBoundToMe"));

とても簡単... ​​:)

1
Rudi

MVVMパターンを使用する方が良いことに同意しますが、現在のページを取得する必要がある場合に備えて、次のように実行できます。

  var frame = (Frame)Window.Current.Content;
  var page = (MainPage)frame.Content;
41
takemyoxygen