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; }
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
Ich auf GitHub hochgeladen, Link ist oben, danke. – Andrii