Я понял интерфейс в 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; }
Если я попытаюсь показать это диалоговое окно от обработчика событий, это не сработает. После того, как линия
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
Я загрузил на GitHub, ссылка выше, спасибо. – Andrii