我有一个有趣的问题,很难调试,因为当我使用文件激活来启动此应用程序时会发生。
如果我直接启动应用程序,没问题。如果我双击关联的文件,该文件将挂在初始屏幕上,甚至不会经过此屏幕(在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版本最低有关。也尝试了这个,没有结果。
答案 0 :(得分:0)
这意味着该应用程序永远不会离开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()
确保该窗口处于活动状态。