在 uwp 应用程序中打开当前虚拟桌面的辅助视图

open secondary view on current virtual desktop in uwp apps

Microsoft 关于虚拟桌面的文档说:

To support this concept, applications should avoid automatically switching the user from one virtual desktop to another. Only the user should instigate that change. In order to support this, newly created windows should appear on the currently active virtual desktop. In addition, if an application can reuse currently active windows, it should only reuse windows if they are on the currently active virtual desktop. Otherwise, a new window should be created.

我完全同意并希望看到我的 UWP 应用程序完全做到这一点。但是,在虚拟桌面 A 上启动应用程序并切换到虚拟桌面 B 后,再次打开应用程序(通过开始菜单或通知) 在执行 OnLaunched 之前让我回到虚拟桌面 A,因此我的新 window 也位于 A .

计算器等其他 uwp 应用程序可以在其他虚拟桌面上正确生成新的 windows,但是如何?

问题是 ApplicationViewSwitcher.TryShowAsStandaloneAsync 方法总是将新 window 与原始 window 对齐,即使原始 window 在不同的虚拟桌面上也是如此。

要避免这种情况,您必须禁用系统的默认视图处理。第一次创建根框架的内容时,禁用默认处理:

ApplicationViewSwitcher.DisableShowingMainViewOnActivation();
ApplicationViewSwitcher.DisableSystemViewActivationPolicy();

创建新视图时,不要使用 ApplicationViewSwitcher.TryShowAsStandaloneAsync 来显示新视图的 window。使用 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!