2017-02-08 31 views
0

WPF Pageでインターフェイスを実現しましたが、PageMainWindowShowInputAsyncを呼び出したいと思います。そのために、私はAutoResetEventPageとブロック機能でイベントを発生させる:ShowInputAsyncが表示されない場合があります

public AutoResetEvent OnMessageReceived; 

public void MessageReceived(object sender, PageReturnMessageEventArgs e) 
{ 
    try 
    { 
     if (e.ToString() == "Cancel" || string.IsNullOrEmpty(e.ToString())) 
     { 
      throw new Exception("Exception of parsing of hours"); 
     } 
    } 
    catch (Exception ex) 
    { 
     // log it 
    } 
    this.OnMessageReceived.Set(); 
} 

private void Page_OnNextPageClick(object sender, EventArgs e) 
{ 
    // ... 

    MessageShow("Additional information", "How much time will this SuperProcess take?", "HOURS"); 

    OnMessageReceived.WaitOne(); 
    OnMessageReceived.Reset(); 

    // ... 
} 

私はMainWindowで任意の関数からShowInputAsyncを表示しようとした場合、それは動作します:

MetroDialogSettings s = new MetroDialogSettings(); 
s.AffirmativeButtonText = @"Create"; 
s.NegativeButtonText = @"Cancel"; 
s.AnimateShow = true; 
var result = await this.ShowInputAsync("Test", "TestMessage", s); 

if (result == null) 
{ return; } 

Image of the dialog

イベントハンドラからこのダイアログを表示しようとすると、動作しません。

var result = await this.ShowInputAsync("Test", "TestMessage", s); 

コードは、任意の例外なくPageに戻り行の後、行に

OnMessageReceived.WaitOne(); 

を実行し、任意のダイアログせずにウィンドウを示し、すべてのControl sが表示されて有効になっているが、私はそれを押すことができません。

また、ダイアログを別の関数に入れて、awaitと一緒に/なしで呼び出すと、何も変わりません。

コードの実行をブロックするためにDialogを呼び出した後にAutoResetEventを使用するには、役に立たなかった。

private AutoResetEvent OnMessageReturning; 
var result = await this.ShowInputAsync(e.Title, e.Message, s); 
OnMessageReturning.WaitOne(); 

も結果なしで、このように別の関数を呼び出そうとしました:

CancellationToken token; 
TaskScheduler uiSched = TaskScheduler.FromCurrentSynchronizationContext(); 
await Task.Factory.StartNew(SeparateFunction, token, TaskCreationOptions.None, uiSched); 

は、どのように私は、イベントハンドラで正しくShowInputAsyncを呼び出すことができますか?またはShowInputAsyncPageからMainWindowに電話するにはどうすればよいですか?

P.S.

  • MahApps.MetroのV1.4.1(NuGetパッケージ)
  • のWindows OS 7
  • のVisual Studio Expressの2015
  • TabControl MainWindowで、 Pageを使用して1 TabItem

    Frameに配置されてあります

  • .NET Framework 4.5

UPD:簡単なサンプルは

+0

私はGitHubにアップロードしました。上記のリンクはありがたいです。 – Andrii

答えて

0

https://github.com/awg21/MahAppsShowInputAsyncFromPageは、私は私が使用しているhereソリューション見つかっです:TryFindParent <

を>> MahApps.Metro.Controls.TreeHelperで定義された拡張メソッドである、と< ShowMessageAsync MahApps.Metro.Controls.Dialogsで定義されています。DialogManager

関連する問題