我尝试在用户默认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的行为会根据读者是否使用选择器启动而发生变化,是否有解决方法?
答案 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
。