2017-02-08 3 views
0

Ich erkannte eine Schnittstelle in WPF Page und ich möchte ShowInputAsync in der MainWindow aufrufen, wo ist die Page ist. Um das zu tun, erhebe ich Ereignis in Page und Blockfunktion mit AutoResetEvent:ShowInputAsync wird manchmal nicht angezeigt

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(); 

    // ... 
} 

Wenn ich versuche, ShowInputAsync von jeder Funktion zu zeigen, in MainWindow es funktioniert:

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

Wenn ich versuche, diesen Dialog vom Event-Handler aus anzuzeigen, funktioniert er nicht. Nach Linie

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

Code Page ohne Ausnahme zurückgibt, führt Zeile

OnMessageReceived.WaitOne(); 

und zeigt das Fenster ohne Dialog, alle Control s zeigen und aktiviert ist, aber ich kann sie nicht drücken.

Ich habe auch versucht, den Dialog in eine separate Funktion zu setzen, und rufen Sie mit/ohne await, nichts ändert sich.

Um AutoResetEvent nach dem Aufruf der Dialog zu verwenden, um die weitere Ausführung des Codes zu blockieren, hat auch nicht geholfen.

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

versuchte auch ergebnislos die separate Funktion auf diese Weise zu nennen:

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

Wie kann ich nennen ShowInputAsync richtig in Ereignishandler? Oder wie kann ich ShowInputAsync von Page in MainWindow anrufen?

P.S. Es wird TabControl in MainWindow wird Page in Frame einen TabItem

Mit gelegt:

  • MahApps.Metro v1.4.1 (NuGet Paket)
  • Windows-O 7
  • Visual Studio Express 2015
  • .NET Framework 4,5

UPD: Einfache Proben https://github.com/awg21/MahAppsShowInputAsyncFromPage

+0

Ich auf GitHub hochgeladen, Link ist oben, danke. – Andrii

Antwort

0

ist ich eine Lösung gefunden here Ich verwende:

TryFindParent <> ist eine Erweiterung Methode in MahApps.Metro.Controls.TreeHelper definiert, und ShowMessageAsync <> ist in MahApps.Metro.Controls.Dialogs definiert.DialogManager

Verwandte Themen