J'ai réalisé une interface dans WPF Page
et je veux appeler ShowInputAsync
dans le MainWindow
, qui est où le Page
est. Pour ce faire, je relance événement dans Page
et la fonction de bloc avec AutoResetEvent
:ShowInputAsync n'est pas parfois affiché
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();
// ...
}
Si je tente de montrer ShowInputAsync
de toute fonction MainWindow
cela fonctionne:
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; }
Si j'essaie d'afficher cette boîte de dialogue à partir du gestionnaire d'événements, cela ne fonctionne pas. Après la ligne
var result = await this.ShowInputAsync("Test", "TestMessage", s);
code retourne à Page
sans exception, est exécutée ligne
OnMessageReceived.WaitOne();
et montre la fenêtre sans dialogue, tous les Control
s montrent et ont permis, mais je ne peux pas les presser.
J'ai également essayé de mettre le dialogue dans une fonction séparée, et l'appeler avec/sans await
, rien ne change.
Pour utiliser AutoResetEvent
après avoir appelé le Dialog
pour bloquer l'exécution du code, n'a également pas aidé.
private AutoResetEvent OnMessageReturning;
var result = await this.ShowInputAsync(e.Title, e.Message, s);
OnMessageReturning.WaitOne();
également essayé d'appeler la fonction séparée de cette manière sans résultat:
CancellationToken token;
TaskScheduler uiSched = TaskScheduler.FromCurrentSynchronizationContext();
await Task.Factory.StartNew(SeparateFunction, token, TaskCreationOptions.None, uiSched);
Comment puis-je appeler ShowInputAsync correctement dans le gestionnaire d'événement? Ou comment puis-je appeler ShowInputAsync
de Page
dans MainWindow
?
P.S. Il est TabControl
dans MainWindow
, Page
est placé dans Frame
d'un TabItem
utilisant:
- MahApps.Metro v1.4.1 (paquet NuGet)
- OS Windows 7
- Visual Studio Express 2015
- .NET Framework 4.5
UPD: échantillon est facile https://github.com/awg21/MahAppsShowInputAsyncFromPage
J'ai téléchargé sur GitHub, le lien est au-dessus, merci. – Andrii