通用 Windows 应用程序如何拥有多个独立窗口(例如 Microsoft 的“照片”应用程序)?

11

我知道如何使用TryShowAsStandaloneAsync打开其他窗口。然而,如果原始窗口关闭了-TryShowAsStandaloneAsync会失败(为什么?)。我不知道如何“恢复”原始窗口(-原始窗口)。

但是,“照片”似乎可以像桌面应用程序一样正常工作。它是怎么做到的?(我想模仿那个。)可以打开一个带有图像的窗口,打开另一个窗口,关闭第一个窗口,仍然能够打开更多的窗口。

任何方法都可以 - 以某种方式启动窗口而不显示主窗口,或者在关闭主窗口后恢复主窗口(为了使其成为必须打开的新窗口),或者其他方法。

3个回答

4
请查看MultipleViews示例应用程序。该应用程序确实存在您所描述的问题。
您创建的每个视图都将拥有自己的UI线程和调度程序。 该应用程序的关键在于,TryShowAsStandaloneAsync是从当前活动窗口的调度程序中调用的。
在示例的OnLaunched事件中,代码使用启动参数中的视图ID查找对当前打开视图的引用。然后,它使用与该视图相关联的调度程序,在该视图的UI线程上使用Dispatcher.RunAsync调用UI代码。您应该使用打开窗口的该线程来调用TryShowAsStandaloneAsync以启动新的主视图。然后,您可以使用新的主视图的调度程序调用Window.Activate

2

回答为什么一旦关闭主窗口,TryShowAsStandaloneAsync就会出错:

我认为TryShowAsStandaloneAsync试图使用主视图作为锚定视图(即相对于其放置新窗口的窗口)。

一旦您关闭了主窗口,TryShowAsStandaloneAsync会因为没有锚定视图而失败。

解决方法是通过TryShowAsStandaloneAsync的一个重载,指定一个打开的视图的anchorViewId(在关闭主窗口之前打开的新窗口之一):

await ApplicationViewSwitcher.TryShowAsStandaloneAsync(
    viewIdToShow, // Id of a new view, or of your hidden main view
    ViewSizePreference.Default,
    anchorViewId, // Id of one of your visible windows
    ViewSizePreference.Default);

来自这个答案


-3

我不确定你是否正在使用 Dispatcher.RunAsync 来创建视图,例如:

async private void Button_Click(object sender, RoutedEventArgs e)
 {
 CoreApplicationView newView = CoreApplication.CreateNewView();
 int newViewId = 0;

await newView.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
 {
 var frame = new Frame();
 frame.Navigate(typeof(MainPage), newViewId);
 Window.Current.Content = frame;

// In Windows 10 UWP we need to activate our view first.
 // Let's do it now so that we can use TryShow...() and SwitchAsync().
 Window.Current.Activate();

newViewId = ApplicationView.GetForCurrentView().Id;
 });

 bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
 }

更多信息,请参考:https://daxsnippets.wordpress.com/2015/07/09/windows-10-create-views/


正如我所说,我知道如何打开其他窗口。问题只出现在主窗口关闭后。 - ispiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接