而不是等待等待呼叫

本文关键字:等待 呼叫 | 更新日期: 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的反馈

而不是等待等待呼叫

我刚刚查看了源代码。

基本上,ShowChildWindowAsyncChildWindowIsOpen集合为true。这将触发IsOpenedChanged,并最终调用

VisualStateManager.GoToState(childWindow, (bool)e.NewValue == false ? "Hide" : "Show", true);

IsOpenGoToState的变化都立即返回,实际结果(窗口的外观)稍后异步生效。