有时不显示 ShowInputAsync

ShowInputAsync is not showed sometimes

我在WPFPage中实现了一个接口,我想在MainWindow中调用ShowInputAsync,也就是Page所在的地方。为此,我在 Page 中引发事件并使用 AutoResetEvent:

阻止函数
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();

    // ...
}

如果我尝试从 MainWindow 中的任何函数显示 ShowInputAsync 它会起作用:

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

代码returns到Page无一例外,执行行

OnMessageReceived.WaitOne();

并显示 window 没有任何对话框,所有 Control 都显示并启用,但我不能按它们。

我也试过将对话框放在一个单独的函数中,并命名为with/without await,没有任何变化。

在调用 Dialog 之后使用 AutoResetEvent 来阻止代码的进一步执行,也没有帮助。

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?或者如何在 MainWindow 中从 Page 调用 ShowInputAsync

P.S。 MainWindow中有TabControlTabItem中有Frame

中有Frame

使用:

UPD:简单示例是 https://github.com/awg21/MahAppsShowInputAsyncFromPage

我找到了解决方案 我正在使用:

TryFindParent<> is an extension method defined in MahApps.Metro.Controls.TreeHelper, and ShowMessageAsync<> is defined in MahApps.Metro.Controls.Dialogs.DialogManager