Как программно открыть файл, который я добавил в свой проект приложения Магазина Windows?
Я хочу загрузить файл PDF в ответ на событие Tapped.
Я добавил файл в свой проект (Add > Existing Item), установил "Build Action" в "Content" и "Copy to Output Directory" в "Copy если новее"
Я думаю, что код, который мне нужен, может быть что-то вроде этого:
async Task LoadTutorial()
{
await Launcher.LaunchUriAsync(new Uri("what should be here to access the output folder?"));
}
Если я прав, что мне нужно передать как Ури? Иначе как это сделать?
ОБНОВИТЬ
Что касается примечания, чтобы добавить изображение в XAML с использованием предложенной схемы, я подумал, что это будет работать:
<Image Source="ms-appx:///assets/axXAndSpaceLogo.jpg"></Image>
... но это не так.
ОБНОВЛЕНИЕ 2
Попытка открыть файл PDF (который находится в корне проекта, а не в подпапке):
async private void OpenTutorial()
{
IStorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
IStorageFile file = await folder.GetFileAsync("ms-appx:///PlatypusTutorial.pdf");
await Launcher.LaunchFileAsync(file);
}
... привело к этому исключению времени выполнения, выданному в первой строке выше:
ОБНОВЛЕНИЕ 3
И с этим, адаптировано из ссылки, представленной:
var uri = new System.Uri("ms-appx:///ClayShannonResume.pdf");
var file = Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);
await Launcher.LaunchFileAsync(file);
... я получаю ошибки времени компиляции:
Наилучшее совпадение перегруженного метода для "Windows.System.Launcher.LaunchFileAsync(Windows.Storage.IStorageFile)" содержит недопустимые аргументы.
-а также:
Аргумент 1: невозможно преобразовать из "Windows.Foundation.IAsyncOperation" в "Windows.Storage.IStorageFile"
... на последней строке.
ОБНОВЛЕНИЕ 4
Согласно странице 76 "Программирование в Pro Windows 8" Лекренски, Нидерландов, Сандерса и Эшели, это должно работать:
<Image Source="Assets/axXAndSpaceLogo.jpg" Stretch="None"></Image>
... (IOW, джаз "ms-appx: ///" не нужен), и он более или менее делает. В моем конкретном случае с моим (большим) изображением мне пришлось сделать следующее:
<Image Source="Assets/axXAndSpaceLogo.jpg" Width="120" Height="80" HorizontalAlignment="Left"></Image>
Без настроек ширины и высоты изображение отображается больше, чем носорог, и обнимает правую сторону выпадающего меню.
ОБНОВЛЕНИЕ 5
Я считаю, что это работает, чтобы открыть файл PDF ("PlatypusTut.pdf" был добавлен в проект, с "Build Action", установленным в "Content" и "Copy to Output Diretory", установленным в "Copy if newer"):
IStorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
IStorageFile file = await folder.GetFileAsync("PlatypusTut.pdf");
bool success = await Launcher.LaunchFileAsync(file);
if (!success)
{
MessageDialog dlgDone = new MessageDialog("Unable to open the Tutorial at this time. Try again later.");
await dlgDone.ShowAsync();
}
... но мне интересно, будет ли это работать только во время разработки, локально. Будет ли это работать при установке на компьютеры пользователей? IOW, достаточно ли просто передать "PlatypusTut.pdf" в GetFileAsync()?
2 ответа
Используйте протокол ms-appx (например, ms-appx:///assets/image.png) для ссылки на элементы в пакете приложений. См. Как загрузить файловые ресурсы (XAML)
ОБНОВИТЬ:
Используйте GetFileFromApplicationUriAsync с ms-appx, чтобы найти файл в пакете приложения. Если файл помечен как контент и включен в пакет приложения, он будет доступен после развертывания, а не только в отладчике. ms-appx:///PlatypusTut.pdf найдет PlatypusTut.pdf в корне пакета приложения.
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///PlatypusTut.pdf"));
await Launcher.LaunchFileAsync(file);
Мы сделали это так:
public async Task OpenResearchAsync(string path)
{
if (path.ToLower().StartsWith("http://"))
{
await Launcher.LaunchUriAsync(new Uri(path));
}
else
{
IStorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
IStorageFile file = await folder.GetFileAsync(path);
await Launcher.LaunchFileAsync(file);
}
}