2013-07-09 6 views
12

私は、C#Windowsストアアプリケーションの別のクラスからメインページの現在のインスタンスにアクセスする方法を知りました。WindowsストアアプリのMainPageの現在のインスタンスにアクセスする最も良い方法は?

特にSurface RTタブレットのWindowsストアアプリ(RT APIに限る)では、他のクラスのメインページメソッドとUI要素にアクセスしたいと考えています。

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

それはメソッド/ UI要素を公開するが、これは正しい手順することができないという点で、新しいインスタンスを作成する

はこのように、動作します。

実行時に他のクラスからメインページのメソッドにアクセスしてUI要素を変更する場合のベストプラクティスは何ですか?これについてはWindows Phone用の記事がいくつかありますが、Windows RTについては何も見つかりません。

+1

私はベストプラクティスであることを行うことはないと言うでしょう。 MVVMなどのパターンを使用して、UIから呼び出すことができるパターンを使用することをお勧めします。 http://en.wikipedia.org/wiki/Model_View_ViewModel – dkackman

+1

MVVMパターンの使用に同意します。最低でも、メインフォームを更新するクラスでイベントを行うことができます。メインフォームにこれらのイベントを購読させ、イベントに応じて独自のUIを処理できるようにします。 –

答えて

2

場合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を呼び出すか、あなたのビューに通知することができます。

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

かなり簡単... ​​:)

-1

私は、委任/イベントを好むので、あなたはクラスに直接アクセスできません。

public MainWindow() 
{ 
    StartWindowUserControl.newBla += StartWindowUserControl_newBla; 

    private void StartWindowUserControl_newBla() 
    { 

public partial class StartWindowUserControl : UserControl 
{ 
    public delegate void newBlaDelegate(); 
    public static event newBlaDelegate newBla; 

MethodA() 
{ 
    new(); 
+0

なぜ新しいデリゲートを作成するのですか?ちょうど 'アクション'を使用してください。また、 'new'はキーワードであるため、' new'という名前のアクションを指定することはできません。 – Servy

+0

ちょうど私のコードから何かを取って、後の部分を削除しました、えええええええええええええええええええええええええええええええええええええええええええええええええ投稿者私はそれが味の問題だと思う。 – Master117

+1

「アクション」型のイベントを見たら、すぐにその署名が何であるか知っている。これはパラメータのない 'void'メソッドです。 'newBlaDelegate'型のイベントを見ると、私はその署名が何であるか分かりません。私はそれを見に行く必要があります。可能であれば、 'Action' /' Func'を使用すると、デリゲート間を自由に渡すことが容易になり、シグネチャが完全に一致したときに、あるデリゲートから別のデリゲートへの変換を心配するのではなく、 – Servy

32

私はそれがMVVMパターンを使用することをお勧めしますことに同意しますが、念のために、あなたは次のようにあなたがそれを行うことができ、現在のページを取得する必要があります:

var frame = (Frame)Window.Current.Content; 
    var page = (MainPage)frame.Content; 
+4

私はこれをどうやってどうやって考えているのか神様。あなたは、チャンピオンと紳士です。どうもありがとうございます。 – MartinJH

関連する問題