【问题标题】:open secondary view on current virtual desktop in uwp apps在 uwp 应用程序中的当前虚拟桌面上打开辅助视图
【发布时间】:2018-01-15 02:07:14
【问题描述】:
微软关于虚拟桌面的文档说:
为支持这一概念,应用程序应避免自动将用户从一个虚拟桌面切换到另一个。只有用户应该发起该更改。为了支持这一点,新创建的窗口应该出现在当前活动的虚拟桌面上。此外,如果应用程序可以重用当前活动的窗口,它应该只重用当前活动虚拟桌面上的窗口。否则,应创建一个新窗口。
我完全同意并希望看到我的 UWP 应用完全这样做。但是,在虚拟桌面 A 上启动应用程序并切换到虚拟桌面 B 后,再次打开应用程序(通过开始菜单或通知)让我回到虚拟桌面OnLaunched 执行之前的桌面 A,因此我的新窗口也驻留在 A 上。
计算器等其他 uwp 应用程序可以在其他虚拟桌面上正确生成新窗口,但如何?
【问题讨论】:
标签:
uwp
multi-window
virtual-desktop
【解决方案1】:
问题在于ApplicationViewSwitcher.TryShowAsStandaloneAsync 方法总是将新窗口与原始窗口对齐,即使原始窗口位于不同的虚拟桌面上。
要避免这种情况,您必须禁用系统的默认视图处理。第一次创建根框架的内容时,禁用默认处理:
ApplicationViewSwitcher.DisableShowingMainViewOnActivation();
ApplicationViewSwitcher.DisableSystemViewActivationPolicy();
创建新视图时,不要使用ApplicationViewSwitcher.TryShowAsStandaloneAsync 来显示新视图的窗口。改用 LaunchActivatedEventArgs 中的 ViewSwitcher:
CoreApplicationView newView = CoreApplication.CreateNewView();
int newViewId = 0;
await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
Frame frame = new Frame();
frame.Navigate(typeof(MainPage), e.Arguments);
Window.Current.Content = frame;
Window.Current.Activate();
var currView = ApplicationView.GetForCurrentView();
currView.Consolidated += CurrView_Consolidated;
newViewId = currView.Id;
await e.ViewSwitcher.ShowAsStandaloneAsync(newViewId);
});
注意: ViewSwitcher.ShowAsStandaloneAsync 必须在新视图的 UI 线程上调用,这与 ApplicationViewSwitcher.TryShowAsStandaloneAsync 不同!