文件激活时,UWP 应用程序在启动画面上冻结

UWP app frozen on splash screen when file activated

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

所以我所做的是:在清单的声明选项卡中,我将文件类型关联添加到我创建的文件类型并确保 "Open is safe" 被选中。然后,使用 OnNavigatedTo 覆盖来捕获用于激活的文件的文件名。我得到启动画面,然后什么都没有。

如果我只是启动应用程序并从内部打开文件,一切正常。令我吃惊的是,我在另一个应用程序中使用了完全相同的 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 版本有关。这个也试过了,没有结果。

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

中调用它

例如检查 AssociationLaunching sample on GitHub specifically 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() 来确保 window 处于活动状态。