一个通用的windows应用程序怎么可能有多个独立的窗口(比如微软的应用程序“照片”)

本文关键字:应用程序 窗口 微软的 照片 独立 一个 windows 可能有 | 更新日期: 2023-09-27 18:21:44

我知道如何使用TryShowAsStandaloneAsync打开其他窗口。但是,如果原始窗口关闭-TryShowAsStandaloneAsync失败(为什么?)。我不知道如何"复活"它(原始窗口)。

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

任何方式都可以——在不显示主窗口的情况下启动窗口,或者在主窗口关闭后恢复主窗口(以便它成为必须打开的新窗口),或者其他方式。

一个通用的windows应用程序怎么可能有多个独立的窗口(比如微软的应用程序“照片”)

查看MultipleViews示例应用程序。此应用程序确实存在您所描述的问题。

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

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

关闭主窗口后回答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);

根据这个答案。

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