我正在使用SimpleChildWindow。 usage guide有关于如何使用的示例。我用这个作为指南:
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的反馈。
答案 0 :(得分:2)
我刚看了一下源代码。
基本上,ShowChildWindowAsync
将ChildWindow
的{{1}}设置为IsOpen
。这会触发true
,最终会调用
IsOpenedChanged
VisualStateManager.GoToState(childWindow, (bool)e.NewValue == false ? "Hide" : "Show", true);
和GoToState
的更改都会立即返回,实际结果(窗口的外观)会在以后异步生效。