2017-02-08 1 views
0

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; } 

Image of the dialog

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

+0

J'ai téléchargé sur GitHub, le lien est au-dessus, merci. – Andrii

Répondre

0

Je trouve une solution here J'utilise:

TryFindParent <> est une méthode d'extension définie dans MahApps.Metro.Controls.TreeHelper et ShowMessageAsync <> est défini dans MahApps.Metro.Controls.Dialogs.DialogManager