2012-03-16 5 views
3

私はSilverlight 5で真のモーダルダイアログを実装するための良い方法を探しています。モーダルダイアログを作成すると主張するすべての例は、コードは、ダイアログが閉じられるまで待機します。Silverlight 5で真のモーダルダイアログを実装する

ダイアログ(ChildWindow)が正しく機能するためには、UIスレッドを実際にブロックすることができないため、これは難しいことです。しかし、SL5にTPLを追加し、Silverlightが過去数年間で見たより高いレベルで、私は誰かがこれを回避する方法を見つけたと考えています。

私が解決しようとしている代表的なシナリオは、ログインダイアログを表示し、続行する前にログインが完了するまで待つ必要があるアクション(ボタンまたはメニュー項目をクリックするなど)です。

私たちの特定のビジネスケース(論理的かどうかにかかわらず)は、アプリケーションがユーザー認証を必要としないことです。ただし、特定の機能には「マネージャー」アクセスが必要です。関数が(ボタンのクリックやメニュー項目の選択などを介して)アクセスされ、現在のユーザーがマネージャでない場合、ログインダイアログが表示されます。ダイアログが閉じると、ユーザーの承認を再度確認します。彼らが許可されていない場合、私たちは素晴らしいメッセージを表示し、アクションを拒否します。権限がある場合は、現在のビューを変更して、ユーザーが要求したとおりに何かを行うことができる新しいものに変更する操作を引き続き実行します。閉鎖さのために

+0

一般的な回避策は、関数をパラメータとして使用する静的(例:ダイアログ)メソッド呼び出しです。通話中に2つのインライン匿名関数を使用してvsが失敗した場合の処理​​を定義します。 *コードの残りの部分はイベント駆動型なので、非同期モデルではなく非同期モデルで作業してください。* :) –

+0

私の場合は、ChildWindowではないサブビューを持つことでモーダルを再実装しました入力がブロックされた要素に到達しないようにする半不透明なビューがあります。 「モーダル」システムの可視性は、データに束縛されています。 – jv42

答えて

5

...

私は何をしてしまったことのようなメソッドを使用して新しいTPL-有効DialogServiceさ:

public Task<Boolean?> ShowDialog<T>() 
    where T : IModalWindow 

方法は、ダイアログ(ChildWindow)のインスタンスを作成しますハンドラをClosedイベントにアタッチし、Showメソッドを呼び出します。内部的には、TaskCompletionSource <ブール値を使用しますか? >を呼び出して、タスクを呼び出し元に返します。 Closedイベントハンドラでは、DialogResultがTaskCompletionSourceのTrySetResult()メソッドに渡されます。

これは、私は典型的な非同期の方法でダイアログを表示することができます:

DialogService.ShowDialog<LoginDialog>().ContinueWith(task => 
{ 
    var result = task.Result; 

    if ((result == true) && UserHasPermission()) 
    { 
     // Continue with operation 
    } 
    else 
    { 
     // Display unauthorized message 
    } 
}, TaskScheduler.FromCurrentSynchronizationContext()); 

それとも、私がTask.Wait()メソッドを使用してブロックすることができる - 私はオリジナルのポストで述べたように、ので、これは問題があるものの、 UIスレッドをブロックするので、ダイアログもフリーズします。

まだモーダルダイアログではありませんが、私が探している動作に少し近づいています。改善や提案はまだ評価されています。

+0

ありがとうございました!!! – lamarmora

関連する問題