而不是等待等待呼叫
本文关键字:等待 呼叫 | 更新日期: 2023-09-27 18:13:05
我使用SimpleChildWindow。使用指南中有如何使用的示例。我用这个作为指南:
private async void OpenAChildWindow_OnButtonClick(object sender, RoutedEventArgs e)
{
// opens a cool child window
await this.ShowChildWindowAsync(new CoolChildWindow() { IsModal = false });
}
我正在呼叫我的按钮点击甚至处理程序如下:
private async void OnChildWindowClick(object sender, RoutedEventArgs e)
{
await Task.Delay(10000);
await this.ShowChildWindowAsync(new SimpleChildWindowImplementation() { IsModal = false, AllowMove = true, Title = "This is title" });
Console.WriteLine("Hello");
}
我看到的是await正确地等待了10秒。然而,第二次等待根本不等待。然后控制台也显示调试"Hello"。当我退出click处理程序方法时,显示子窗口。
为什么不先显示子窗口,然后再调试"Hello"消息?
现在的SimpleChildWindowImplementation与提供的示例中的CoolChildWindow完全相同。我的想法是以后修改它以适应我的需要。
编辑:我改变了ChildWindowManager.cs,并调整了ShowChildWindowInternalAsync函数的实现,如下所示,使其工作。
private static Task<string> ShowChildWindowInternalAsync(ChildWindow dialog, Panel container)
{
var tcs = new TaskCompletionSource<string>();
var firstTask = Task.Factory
.StartNew(() => dialog.Dispatcher.Invoke(new Action(() => container.Children.Add(dialog))));
var continuationTask = firstTask.ContinueWith(_ => dialog.Dispatcher.Invoke(
new Func<Task>(() =>
{
RoutedEventHandler handler = null;
handler = (sender, args) =>
{
dialog.ClosingFinished -= handler;
container.Children.Remove(dialog);
tcs.TrySetResult("done");
};
dialog.ClosingFinished += handler;
dialog.IsOpen = true;
return tcs.Task;
})));
return tcs.Task;
}
未标记为答案。将等待@punker76的反馈
我刚刚查看了源代码。
基本上,ShowChildWindowAsync
将ChildWindow
的IsOpen
集合为true
。这将触发IsOpenedChanged
,并最终调用
VisualStateManager.GoToState(childWindow, (bool)e.NewValue == false ? "Hide" : "Show", true);
IsOpen
和GoToState
的变化都立即返回,实际结果(窗口的外观)稍后异步生效。