Как программно открыть файл, который я добавил в свой проект приложения Магазина 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);
    }
}
Другие вопросы по тегам