当DisplayApplicationPicker = false时,Launcher.LaunchUriAsync()失败

时间:2016-04-28 16:15:35

标签: c# win-universal-app

我尝试在用户默认PDF阅读器中启动PDF:

public async void NoPicker()
{
    var options = new LauncherOptions() { ContentType = "application/pdf" };

    await Launcher.LaunchUriAsync(new Uri("http://bitcoin.org/bitcoin.pdf"), options);
}

当默认阅读器为Foxit时,此功能正常,但IE和Edge无效。

但是,如果我使用DisplayApplicationPicker设置调用LaunchUriAsync,并在应用程序选择器中选择IE或Edge,它会毫无问题地启动:

public async void WithPicker()
{
   var options = new LauncherOptions() { ContentType = "application/pdf", DisplayApplicationPicker = true};

   await Launcher.LaunchUriAsync(new Uri("http://bitcoin.org/bitcoin.pdf"), options);
}

为什么LaunchUriAsync的行为会根据读者是否使用选择器启动而发生变化,是否有解决方法?

1 个答案:

答案 0 :(得分:1)

经过一些测试和调查后,我发现此问题与ContentType property有关,似乎ContentType = "application/pdf"类型无法将指向网络资源的URI关联起来。但是Windows会尝试使用从内容类型计算的文件类型来选择要启动的应用程序,因此它会打开Edge,但它不会指向您的URI。您也可以参考ContentType,没有这样的pdf内容类型。

我不知道为什么Foxit可以在这种情况下工作,所以这个问题也可能与您使用的读者有关。

要解决此问题,您可以像这样修改代码:

public async void NoPicker()
{
    var options = new LauncherOptions();
    await Launcher.LaunchUriAsync(new Uri("http://bitcoin.org/bitcoin.pdf"), options);
}

当默认浏览器是Edge或Chrome时,它将直接打开此pdf文件,但在使用IE时,它将打开用户界面(UI)以允许用户选择下载此文件。

要确认我对ContentType的结论,您可以将其更改为不同的类型进行测试,例如您可以测试options.ContentType = "application/x-compress";,它会使其行为类似于设置DisplayApplicationPicker = true