有时不显示 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
中有TabControl
,TabItem
中有Frame
,
中有Frame
使用:
- MahApps.Metro v1.4.1(NuGet 包)
- Windows OS 7
- Visual Studio 快递 2015
- .NET Framework 4.5
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
我在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
中有TabControl
,TabItem
中有Frame
,
Frame
使用:
- MahApps.Metro v1.4.1(NuGet 包)
- Windows OS 7
- Visual Studio 快递 2015
- .NET Framework 4.5
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