2017-02-03 16 views
0

トローリングをたくさんして、必要な情報を見つけましたが、すべての部分をどのように合わせるかまだまだ問題はありません。私は、ビルドを妨げる1.エラーを表示するか、メッセージが表示されないか、3.メッセージが表示されますが、その間にプログラムは続けられます。Xamarinフォーム - このDisplayAlertが動作するのを止めて

私は以前のセッションから情報を読み込むことに関連するユーザーの質問をしたいと思います。この答えを待つべきです。私はどこかで非同期/待機が必要であることを知っています。また、(ブール値または文字列として)回答が必要です。また、メッセージが実際に最初に表示されるためには、Device.BeginInvokeOnMainThreadおよび/またはOnAppearingが必要であることがわかりました。私が見たほとんどの例は、ボタンのクリックや他のイベントに結びつけることを中心にしていますが、これは最初から実行しておき、答えが出るまで何もしません(最初の画面の情報の読み込みは答え)。

DisplayAlert(「Resume?」、「最後のセッションからデータをリロードしますか?」、「はい」、「いいえ」)の場合、スタートアップ時に表示されるように、 (つまり、私はリロードまたは再初期化しています)、他の場所からその答えにアクセスすることができます(つまり、コードの残りの部分でアクセスするために何らかの変数を使用します)。初めてDisplayAlertを使用したのは、async/awaitを初めて使用したとき、Device.BeginInvokeを初めて使用したときです... - 私はさまざまなバリエーションを試していましたが、前述の3つの結果の1つを得続けます。 :-(

+0

これはページのみで動作し、 'await'を使う必要があります –

+0

これはなぜ動作しないのか分かりました。 Charles Petzoldの本の中の行を読むと、メインページでこれを行うことはできません.... "アプリケーションの他のすべてのページは、2つの異なるカテゴリに分類されるため、開始ページと本質的に異なります。モーダルページとモードレスページ ユーザーインターフェイスのデザインでは、「モーダル」とは、アプリケーションを続行するにはユーザーの操作が必要なものを指します。 私がする必要があると思うのは、メインページとしてメニューを書いて、前の情報で再開したり、新鮮なものから始めたり、そこから移動したりすることです。 – donaldp

+0

誰かがその本を読んでいることを知ってうれしいです。いいことは不思議ではありません:)ここでは、https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/popupup/ –

答えて

-1

私はこれで、あなたのMVVMコードからダイアログを呼び出すことができます。Acr.Userdialogs nugetパッケージを使用しています。あなたは非同期方法から

var needToResume = await UserDialogs.Instance.ConfirmAsync(
    message: "Do you want to reload your data from last session?", 
    title: "Resume?", 
    okText: "yes", 
    cancelText: "no", 
    cancelToken: cancelationTokenSource.Token); 

。それとも

var needToResume = UserDialogs.Instance.ConfirmAsync(
    message: "Do you want to reload your data from last session?", 
    title: "Resume?", 
    okText: "yes", 
    cancelText: "no", 
    cancelToken: cancelationTokenSource.Token).Result; 

から行うことができますダイアログの呼び出し直後にnavigate/do_other_thingsのコードを配置する また、コールバックを使用することもできます:

UserDialogs.Instance.Confirm(new ConfirmConfig 
    { 
     AndroidStyleId = null, 
     Title = "Resume?", 
     Message = "Do you want to reload your data from last session?", 
     OkText = "yes", 
     CancelText = "no", 
     OnAction = DoThings 
    }); 

private void DoThings(bool needToResume) 
{ 
    //do things 
} 
+0

このパッケージは私のためにインストールされていません - それを2回試してみましたが、それはVSをハングアップさせてしまいました。私はそれをインストールすることができれば私はそれと一緒に行く方法を知らせます。 – donaldp

+0

私のために完全に動作します。 VSは何を使用していますか? Nuget VS Extensionを更新してみてください。たぶん少し待つかもしれない。 –

+0

2再起動して、私はそれを行ったが、 "名前 'cancelationTokenSource'は現在のコンテキストに存在しません"と言います。私は「acr.userdialogsを使用している」ので、何が必要なのか分からない。 – donaldp

2

OnAppearingページの方法でDisplayAlertを使用することができます。

protected async override void OnAppearing() 
    { 
     var answer = await DisplayAlert("Title", "Message", "Positive Button - Yes", "Nagative Button - No"); 
     if (answer) 
     { 
      //Do your code here. 
     } 
    } 

これはうまくいきます。

+0

ありがとうございますが、いいえ、このコードに満足していません。スイッチにはboolが必要ですが、varをboolに変更すると、DisplayAlertはタスクを返します。その対処方法はわかりません。また、どこかで非同期なしで待つこともできません。私がDisplayAlertを使用していないこと、または以前にawait/asyncを使用していないことを覚えておいてください。どこに配置する必要があるのか​​を明確にする必要があります。ここのコードだけではコンパイルされません(私はそれが簡単だったと思います)。 :-( – donaldp

+0

私は私の答えを編集しました。これがあなたのために働くことを願っています。 –

関連する問題