2017-02-08 16 views
0

Я понял интерфейс в WPF Page, и я хочу позвонить ShowInputAsync в MainWindow, где находится Page. Для того, чтобы сделать это, я поднимаю событие в Page и функциональный блок с AutoResetEvent: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(); 

    // ... 
} 

Если я пытаюсь показать ShowInputAsync из любой функции в MainWindow это работает:

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, ничего не меняется.

Использовать AutoResetEvent после вызова Dialog, чтобы заблокировать дальнейшее выполнение кода, также не помогло.

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 правильно в обработчик событий? Или как я могу позвонить ShowInputAsync от Page в MainWindow?

P.S. Там находится TabControl в MainWindow, Page помещается в Frame одного TabItem

Использование:

  • MahApps.Metro v1.4.1 (NuGet пакет)
  • операционная система Windows 7
  • Visual Studio Express 2015
  • . NET Framework 4.5

UPD: Легкий образец https://github.com/awg21/MahAppsShowInputAsyncFromPage

+0

Я загрузил на GitHub, ссылка выше, спасибо. – Andrii

ответ

0

Я нашел решение here я использую:

< TryFindParent> это метод расширения определяется в MahApps.Metro.Controls.TreeHelper и ShowMessageAsync <> определяется в MahApps.Metro.Controls.Dialogs.DialogManager