文件激活时,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
中相同的步骤 - 所以通常你可以将初始化转换为一个方法并从 OnLaunched
和 OnActivated
.
中调用它
例如检查 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 处于活动状态。
我有一个有趣的问题,很难调试,因为它发生在我使用文件激活启动此应用程序时。
如果我直接启动应用程序,没问题。如果我双击关联的文件,它会挂在初始屏幕上,甚至不会超过这个(在 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
中相同的步骤 - 所以通常你可以将初始化转换为一个方法并从 OnLaunched
和 OnActivated
.
例如检查 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 处于活动状态。