Compartir datos
Este artículo explica cómo admitir el contrato para contenido compartido en una aplicación para la Plataforma universal de Windows (UWP). El contrato para contenido compartido es una manera sencilla de compartir rápidamente los datos, como texto, vínculos, fotos y vídeos, entre aplicaciones. Por ejemplo, es posible que un usuario quiera compartir una página web con sus amigos mediante una aplicación de red social, o guardar un vínculo en una aplicación de notas para consultarlo más adelante.
Nota:
Los ejemplos de código de este artículo proceden de aplicaciones para UWP. Las aplicaciones de escritorio deben usar IDataTransferManagerInterop. Para obtener más información y ejemplos de código, consulta Mostrar objetos de interfaz de usuario de WinRT que dependen de CoreWindow. Consulte también el ejemplo de aplicación de origen de contenido de uso compartido de WPF.
Configuración de un controlador de eventos
Agregue un controlador de eventos DataRequested al que se llamará cada vez que un usuario invoca el recurso compartido. Esto puede ocurrir cuando el usuario pulsa un control en la aplicación (por ejemplo, un botón o un comando de barra de la aplicación) o automáticamente en un escenario específico (si el usuario finaliza un nivel y obtiene una puntuación alta, por ejemplo).
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += DataTransferManager_DataRequested;
Cuando se produce un evento DataRequested, la aplicación recibe un objeto DataRequest. Contiene un DataPackage que puede usar para proporcionar el contenido que el usuario quiere compartir. Debe proporcionar un título y datos para compartir. Una descripción es opcional, pero se recomienda.
DataRequest request = args.Request;
Elegir datos
Puede compartir varios tipos de datos, entre los que se incluyen:
- Texto sin formato
- Identificador uniforme de recursos (URI)
- HTML
- Texto con formato
- Mapas de bits
- Archivos
- Datos personalizados definidos por el desarrollador
El objeto DataPackage puede contener uno o varios de estos formatos, en cualquier combinación. En el ejemplo siguiente se muestra cómo compartir texto.
request.Data.SetText("Hello world!");
Establecimiento de las propiedades
Al empaquetar datos para compartir, puede proporcionar una variedad de propiedades que proporcionan información adicional sobre el contenido que se comparte. Estas propiedades ayudan a las aplicaciones de destino a mejorar la experiencia del usuario. Por ejemplo, una descripción ayuda cuando el usuario comparte contenido con más de una aplicación. Agregar una miniatura al compartir una imagen o un vínculo a una página web proporciona una referencia visual al usuario. Para obtener más información, consulte DataPackagePropertySet.
Advertencia
Todas las propiedades excepto el título son opcionales. La propiedad title es obligatoria y debe establecerse.
request.Data.Properties.Title = "Share Example";
request.Data.Properties.Description = "A demonstration on how to share";
Inicio de la interfaz de usuario del recurso compartido
El sistema proporciona una interfaz de usuario para compartir. Para iniciarlo, llame al método ShowShareUI.
DataTransferManager.ShowShareUI();
errores
En la mayoría de los casos, compartir contenido es un proceso sencillo. Sin embargo, siempre hay una posibilidad de que ocurra algo inesperado. Por ejemplo, es posible que la aplicación requiera que el usuario seleccione contenido para compartir, pero el usuario no ha seleccionado ninguno. Para controlar estas situaciones, use el método FailWithDisplayText, que mostrará un mensaje al usuario si algo va mal.
Retrasar el recurso compartido con delegados
A veces, es posible que no tenga sentido preparar los datos que el usuario quiere compartir inmediatamente. Por ejemplo, si la aplicación admite el envío de un archivo de imagen grande en varios formatos posibles diferentes, es ineficaz crear todas esas imágenes antes de que el usuario realice su selección.
Para solucionar este problema, un DataPackage puede contener un delegado: una función a la que se llama cuando la aplicación receptora solicita datos. Se recomienda usar un delegado cada vez que los datos que un usuario quiere compartir consumen muchos recursos.
async void OnDeferredImageRequestedHandler(DataProviderRequest request)
{
// Provide updated bitmap data using delayed rendering
if (this.imageStream != null)
{
DataProviderDeferral deferral = request.GetDeferral();
InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();
// Decode the image.
BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(this.imageStream);
// Re-encode the image at 50% width and height.
BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
await imageEncoder.FlushAsync();
request.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
deferral.Complete();
}
}