一个通用的windows应用程序怎么可能有多个独立的窗口(比如微软的应用程序“照片”)
本文关键字:应用程序 窗口 微软的 照片 独立 一个 windows 可能有 | 更新日期: 2023-09-27 18:21:44
我知道如何使用TryShowAsStandaloneAsync
打开其他窗口。但是,如果原始窗口关闭-TryShowAsStandaloneAsync
失败(为什么?)。我不知道如何"复活"它(原始窗口)。
但是"照片"似乎可以像桌面应用程序一样正常工作。它是怎么做到的?(我想模仿一下。)一个人可以打开一个有图像的窗口,打开另一个,关闭第一个,但仍然可以打开更多的窗口。
任何方式都可以——在不显示主窗口的情况下启动窗口,或者在主窗口关闭后恢复主窗口(以便它成为必须打开的新窗口),或者其他方式。
查看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/