c# - ¿Cómo puedo abrir un archivo que he agregado a mi proyecto de Windows Store App programáticamente?
windows-runtime windows-store-apps (2)
Lo hicimos de esa manera:
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);
}
}
Quiero cargar un archivo PDF en respuesta a un evento Tapped.
Agregué el archivo a mi proyecto (Agregar> Artículo existente), establecí "Crear acción" a "Contenido" y "Copiar al directorio de salida" a "Copiar si es más nuevo"
Estoy pensando que el código que necesito puede ser algo como esto:
async Task LoadTutorial()
{
await Launcher.LaunchUriAsync(new Uri("what should be here to access the output folder?"));
}
Si estoy en lo cierto, ¿qué necesito pasar como Uri? De lo contrario, ¿cómo se logra esto?
ACTUALIZAR
En una nota relacionada, para agregar una imagen al XAML usando el esquema sugerido, pensé que esto funcionaría:
<Image Source="ms-appx:///assets/axXAndSpaceLogo.jpg"></Image>
... pero no es así.
ACTUALIZACIÓN 2
Intentando esto para abrir el archivo PDF (que se encuentra en la raíz del proyecto, no en una subcarpeta):
async private void OpenTutorial()
{
IStorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
IStorageFile file = await folder.GetFileAsync("ms-appx:///PlatypusTutorial.pdf");
await Launcher.LaunchFileAsync(file);
}
... resultó en esta excepción de tiempo de ejecución, lanzada en la primera línea de arriba:
ACTUALIZACIÓN 3
Y con esto, adaptado del enlace provisto:
var uri = new System.Uri("ms-appx:///ClayShannonResume.pdf");
var file = Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);
await Launcher.LaunchFileAsync(file);
... Obtengo los errores de tiempo de compilación:
La mejor coincidencia de método sobrecargado para ''Windows.System.Launcher.LaunchFileAsync (Windows.Storage.IStorageFile)'' tiene algunos argumentos inválidos
-y:
Argumento 1: no se puede convertir de ''Windows.Foundation.IAsyncOperation'' a ''Windows.Storage.IStorageFile''
... en la última línea.
ACTUALIZACIÓN 4
De acuerdo con la página 76 de "Pro Windows 8 Programming" de Lecrenski, Holanda, Sanders y Ashely, esto debería funcionar:
<Image Source="Assets/axXAndSpaceLogo.jpg" Stretch="None"></Image>
... (IOW, el jazz " ms-appx: /// " es innecesario), y más o menos lo hace. En mi caso particular, con mi (gran) imagen, tuve que hacer esto:
<Image Source="Assets/axXAndSpaceLogo.jpg" Width="120" Height="80" HorizontalAlignment="Left"></Image>
Sin los ajustes de ancho y alto, la imagen se muestra más grande que un rinoceronte, y abraza el lado derecho del menú lateral.
ACTUALIZACIÓN 5
Me parece que esto funciona para abrir un archivo PDF ("PlatypusTut.pdf" se ha agregado al proyecto, con "Build Action" establecido en "Contenido" y "Copy to Output Diretory" establecido en "Copiar si es nuevo"):
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();
}
... pero me pregunto si esto solo funcionará en tiempo de diseño, localmente. ¿Funcionará esto cuando esté instalado en las máquinas del usuario también? IOW, ¿es suficiente pasar simplemente "PlatypusTut.pdf" a GetFileAsync ()?
Utilice el protocolo ms-appx (por ejemplo, ms-appx: ///assets/image.png) para hacer referencia a los elementos en el paquete de aplicaciones. Vea Cómo cargar recursos de archivos (XAML)
ACTUALIZAR:
Use GetFileFromApplicationUriAsync con ms-appx para encontrar el archivo en el paquete de la aplicación. Si el archivo está marcado como contenido e incluido en el paquete de la aplicación, estará disponible una vez implementado y no solo desde el depurador. ms-appx: ///PlatypusTut.pdf encontrará PlatypusTut.pdf en la raíz del paquete de la aplicación.
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///PlatypusTut.pdf"));
await Launcher.LaunchFileAsync(file);