-1

微软关于虚拟桌面的文档说:

为了支持这一概念,应用程序应避免自动将用户从一个虚拟桌面切换到另一个。只有用户应该发起该更改。为了支持这一点,新创建的窗口应该出现在当前活动的虚拟桌面上。此外,如果应用程序可以重用当前活动的窗口,它应该只重用当前活动虚拟桌面上的窗口。否则,应创建一个新窗口。

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

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

4

1 回答 1

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 不同!

于 2018-01-14T18:07:14.910 回答