文件激活时 UWP 应用程序冻结在初始屏幕上

Posted

技术标签:

【中文标题】文件激活时 UWP 应用程序冻结在初始屏幕上【英文标题】:UWP app frozen on splash screen when file activated 【发布时间】:2019-03-26 03:39:25 【问题描述】:

我有一个有趣的问题,很难调试,因为它发生在我使用文件激活启动此应用程序时。 如果我直接启动应用程序,没问题。如果我双击关联的文件,它会挂在启动屏幕上,甚至不会超过这个(在InitializeComponent 设置调试断点,它甚至都没有到达那里)。

所以我所做的是:在清单的声明选项卡中,我向我创建的文件类型添加了一个文件类型关联,并确保选中了“打开是安全的”。然后,使用OnNavigatedTo override 来捕获用于激活的文件的文件名。我得到启动画面,然后什么也没有。

如果我只是启动应用程序并从内部打开文件,一切正常。让我感到震惊的是,我在另一个应用程序中使用了确切的 OnNavigatedTo,而且它运行良好。

这是我的 OnNavigatedTo:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    
        base.OnNavigatedTo(e);
        var args = e.Parameter as Windows.ApplicationModel.Activation.IActivatedEventArgs;
        if (args != null)
        
            if (args.Kind == Windows.ApplicationModel.Activation.ActivationKind.File)
            
                var fileArgs = args as Windows.ApplicationModel.Activation.FileActivatedEventArgs;
                string strFilePath = fileArgs.Files[0].Path;
                var file = (StorageFile)fileArgs.Files[0];
                //MainPlayList is a custom object used to manipulate the playlist of stuff I'm building.
                MainPlayList = new Playlist();
                MainPlayList.InitializePlayList();
                await MainPlayList.AddImageToPlaylist(file);
             
       
    

我已经检查了工作应用程序和这个应用程序的包清单。除了名称之外,它们是相同的。大约 18 个月前有人提到,这可能与最低使用的 Windows 版本有关。也试过了,没有结果。

【问题讨论】:

初始化组件为类运行 Load 方法。例如,一个 windows 窗体类将运行 Designer.cs 文件中的代码。 在您的文件激活中写入 System.Diagnostics.Debugger.Launch() 如果并调试您的应用程序。 这只是一个断点,我用来开始跟踪应用程序的去向,如果有的话。当我启动它时,没问题它就停在那里。文件激活后,我什至无处可去。主窗口甚至没有被创建。 试试这个 if (args.Kind == Windows.ApplicationModel.Activation.ActivationKind.File) System.Diagnostics.Debugger.Launch();... @Access Denied,试过这个。 “此平台不支持操作”....相反,我使用 VS2017 Debug/Other Debug Targets/Debug Universal Window App Pre-Launch,然后进行文件激活。 【参考方案1】:

这意味着应用程序永远不会离开 App.xaml.cs 中的激活处理程序 - 当应用程序尚未启动并且文件激活时,它永远不会转到 OnLauched 并调用 OnActivated method,您可以覆盖它 - 并且您应该 - 初始化根Frame 并激活Window。本质上,您需要执行与OnLaunched 相同的步骤 - 所以通常您可以将初始化转换为方法并从OnLaunchedOnActivated 调用它。

例如,检查 GitHub 上的 AssociationLaunching sample,特别是 here - OnFileActivated(这是捕获文件激活的替代方法)。

protected override void OnFileActivated(FileActivatedEventArgs e)

    Frame rootFrame = CreateRootFrame();

    if (rootFrame.Content == null)
    
        if (!rootFrame.Navigate(typeof(MainPage)))
        
            throw new Exception("Failed to create initial page");
        
    

    var p = rootFrame.Content as MainPage;
    p.NavigateToPageWithParameter(2, e);

    // Ensure the current window is active
    Window.Current.Activate();

如果应用程序之前没有启动,CreateRootFrame 首先创建并设置根框架,以便它准备好。最后,它使用Window.Current.Activate() 来确保窗口处于活动状态。

【讨论】:

我明白了,马丁,非常有用。除了“在当前上下文中不存在”的 CreateRootFrame ...我将覆盖托管在“公共部分类 App : Application”中,它是正确的类吗? 是的,那是因为您必须自己实现它 - 请参阅示例 - 他们也手动执行。该方法应该与OnLaunched中的基本相同 - 检查是否有根框架,如果没有,则创建它 - github.com/Microsoft/Windows-universal-samples/blob/… 哦!错过了!它在 Apps.xaml.cs 中......对不起!在我们说话时对其进行测试,非常感谢您的快速回答! 非常感谢马丁!完美地工作!稍后将在此处添加我的确切代码和解释,因为我一直在到处寻找这个并且找不到明确的答案。应该看看样本.... 太好了,很高兴它有帮助:-)。是的,有时文档应该更详细。幸运的是它们是开源的,所以如果我有时间,也许我会贡献这个。编码愉快!

以上是关于文件激活时 UWP 应用程序冻结在初始屏幕上的主要内容,如果未能解决你的问题,请参考以下文章

TestFlight 应用程序在启动时冻结 [关闭]

iOS 应用程序在使用 Realm 和 Crashlytics 通过 testflight 启动时冻结

从 xcode 10.1 安装到 iOS 12+ 时,应用程序在启动屏幕上冻结

iOS 应用程序在设备上启动后连接调试器时冻结在空白屏幕上

导航到另一个屏幕时,应用程序在 IOS 上冻结 - React Navigation

从后台服务打开应用程序屏幕并锁定手机屏幕时冻结