激活文件后,UWP应用在初始屏幕上冻结

时间:2018-10-22 05:36:05

标签: c# file uwp activation

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

所以我要做的是:在“清单的声明”选项卡中,我向创建的文件类型添加了文件类型关联,并确保选中了“打开是安全的”。然后,使用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版本最低有关。也尝试了这个,没有结果。

1 个答案:

答案 0 :(得分:0)

这意味着该应用程序永远不会离开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()确保该窗口处于活动状态。