一个通用的 windows 应用程序如何拥有多个独立的 windows(如微软的应用程序“照片”)?

How can a universal windows app have multiple independent windows (Like Microsoft's app “Photos”)?

我知道如何使用 TryShowAsStandaloneAsync 打开额外的 windows。但是,如果原来的 window 被关闭 - TryShowAsStandaloneAsync 失败(为什么?)。 And I don't know how to "revive" it(-原window).

但是 "Photos" 似乎可以像桌面应用程序一样正常工作。它是如何做到的? (我想效仿。)一个人可以打开一个带有图像的 window,打开另一个,关闭第一个,并且仍然能够打开更多 windows.

任何方式都可以 - 在没有显示主 window 的情况下启动 windows 的某种方式,或者在关闭后恢复主 window 的某种方式(为了它成为必须打开的新 window)或其他方式。

我不确定您是否使用 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/

看看MultipleViews sample app。此应用确实存在您描述的问题。

您创建的每个视图都有自己的 UI 线程,因此也有调度程序。 这个应用程序的关键是 TryShowAsStandaloneAsync 是从当前活动 window 的调度程序调用的。

在示例的 OnLaunched 事件中,代码使用启动参数中的视图 ID 查找对当前打开视图的引用。然后它使用与该视图关联的调度程序在该视图的 UI 线程上使用 Dispatcher.RunAsync 调用 UI 代码。您应该使用打开的线程 window 来调用 TryShowAsStandaloneAsync 以启动您的新主视图。然后,您可以使用新主视图的调度程序调用 Window.Activate

关闭主 window 后回答 TryShowAsStandaloneAsync 失败的原因:

我认为 TryShowAsStandaloneAsync 尝试使用主视图作为锚视图(即 window 放置新的 window 相对)。

关闭主 window TryShowAsStandaloneAsync 失败,因为它没有锚点视图。

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

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);

来自 .