2017-06-12 5 views
0

DisplayAlertが私のアプリのどこかで呼び出されるといつでも通知を受けたいと思います。それはDisplayAlert()内のメッセージを送信するためにそれを使用しているので、Xamarin.Forms source codeは、MessagingCenterを使用することを示唆している: Xamarin.FormsでDisplayAlertを購読する

MessagingCenter.Send(this, AlertSignalName, args); 
しかし、私はまだ、何かを受け取ることができませんでした。これまでに試したことの1つです:

MessagingCenter.Subscribe<Page>(this, Page.AlertSignalName, arg => { 
    Console.WriteLine("Message received: " + arg); 
}); 

これは正しい方向ですか?あるいは、代替ソリューションがありますか?私はテスト目的だけのために必要なので、いくつかのハッキーリフレクションベースのアプローチを考慮する。

+0

興味深い。決して試していません...あなたのアプローチはうまくいきませ –

+0

@AlessandroCaliaroいいえ、私は 'Page'と' Page.AlertSignalName'を変えようとしましたが、デリゲートは決して呼び出されませんでした。 – Falko

+0

私は見ています。私は何も約束しません... –

答えて

0

これが私の作品:

MessagingCenter.Subscribe<Page, Xamarin.Forms.Internals.AlertArguments>(this, Page.AlertSignalName, (obj, obj1) => { 
    int aa = 0; 
}); 

しかしDisplayAlertが表示されたときに、それが発生します。

[Test] 
public void DisplayAlert() 
{ 
    var page = new ContentPage(); 

    AlertArguments args = null; 
    MessagingCenter.Subscribe (this, Page.AlertSignalName, (Page sender, AlertArguments e) => args = e); 

    var task = page.DisplayAlert ("Title", "Message", "Accept", "Cancel"); 

    Assert.AreEqual ("Title", args.Title); 
    Assert.AreEqual ("Message", args.Message); 
    Assert.AreEqual ("Accept", args.Accept); 
    Assert.AreEqual ("Cancel", args.Cancel); 

    bool completed = false; 
    var continueTask = task.ContinueWith (t => completed = true); 

    args.SetResult (true); 
    continueTask.Wait(); 
    Assert.True (completed); 
} 

Xamarin source test code(名前空間 Xamarin.Forms.Core.UnitTests)で
using System; 
using Xamarin.Forms; 

namespace Test 
{ 
    public class MyPage : ContentPage 
    { 
     public MyPage() 
     { 
      Button b = new Button {Text = "Press" }; 
      b.Clicked += async (object sender, EventArgs e) => { 
       await DisplayAlert("Attention", "AAA", "Ok"); 
       MessagingCenter.Send<MyPage>(this, "AAA"); 
      }; 

      Content = new StackLayout 
      { 
       Children = { 
        new Label { Text = "Hello ContentPage" }, 
        b 
       } 
      }; 

      MessagingCenter.Subscribe<MyPage>(this, "AAA", (obj) => { 
       int aa = 0; 
      }); 
      MessagingCenter.Subscribe<Page, Xamarin.Forms.Internals.AlertArguments>(this, Page.AlertSignalName, (obj, obj1) => { 
       int aa = 0; 
      }); 
     } 
    } 
} 
+1

XFromsのソースコードが含まれていますか? "AlertArgumentsはネームスペース 'Xamarin.Forms.Internals'には存在しません(アセンブリ参照がありませんか?)" AlertArgumentsは公開されていません –

+0

何も指定しないでください。コード、それは動作する必要があります。あなたはXFを更新しましたか? –

+0

すべての最新とFalkoは同じ結果を得ます –

0

、それはそのような強く型付けされた方法で使われています:

これは私のページです(私は...それが正しいことだと思います)これはそれを行う必要があります:

MessagingCenter.Subscribe(this, Page.AlertSignalName, (Page sender, AlertArguments args) => 
{ 
    Console.WriteLine("Message received: " + args.Message); 
}); 
+1

他の回答のAlertArgumentsに関するコメントを参照してください。 –

+0

@YuriSは 'internal'保護レベルのため' AlertArguments'にアクセスできません。 – Falko

+0

Hmm私の悪い申し訳ありません私は同時に書いていた...途中で非常に面白い! –

関連する問題