【问题标题】:How can a universal windows app have multiple independent windows (Like Microsoft's app “Photos”)?一个通用的窗口应用程序怎么会有多个独立的窗口(比如微软的应用程序“照片”)?
【发布时间】:2016-02-15 00:14:10
【问题描述】:

我知道如何使用TryShowAsStandaloneAsync 打开其他窗口。但是,如果原始窗口关闭 - TryShowAsStandaloneAsync 失败(为什么?)。 And I don't know how to "revive" it(-原始窗口)。

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

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

【问题讨论】:

    标签: c# windows-runtime windows-store-apps win-universal-app uwp


    【解决方案1】:

    看看MultipleViews sample app。此应用确实存在您所描述的问题。

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

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

    【讨论】:

      【解决方案2】:

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

      来自this answer

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 正如我所说,我确实知道如何打开其他窗口。问题只是在主窗口关闭之后。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 2022-01-23
        • 1970-01-01
        • 2022-10-08
        相关资源
        最近更新 更多