文件激活时 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
相同的步骤 - 所以通常您可以将初始化转换为方法并从OnLaunched
和OnActivated
调用它。
例如,检查 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 应用程序冻结在初始屏幕上的主要内容,如果未能解决你的问题,请参考以下文章
iOS 应用程序在使用 Realm 和 Crashlytics 通过 testflight 启动时冻结
从 xcode 10.1 安装到 iOS 12+ 时,应用程序在启动屏幕上冻结