Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El contrato de Windows Compartir permite a los usuarios compartir contenido rápidamente (como texto, vínculos, fotos y vídeos) desde la aplicación a otras aplicaciones. Por ejemplo, es posible que un usuario quiera compartir una página web con sus amigos mediante una aplicación de redes sociales o guardar un vínculo en una aplicación de notas para hacer referencia más adelante.
Este artículo explica cómo implementar el lado de origen del contrato Compartir: el código que prepara el contenido y abre la hoja de compartir de Windows desde tu aplicación. Para obtener información sobre cómo recibir contenido compartido, consulte Recepción de datos compartidos en la aplicación de Windows.
Las Windows.ApplicationModel.DataTransfer API que se usan en este artículo funcionan para las aplicaciones que tienen identidad de paquete, incluidas las aplicaciones para UWP y las aplicaciones de escritorio winUI 3 empaquetadas. Las aplicaciones Win32 sin empaquetar pueden participar concediéndole identidad de paquete y usando IDataTransferManagerInterop.
Note
Las aplicaciones de escritorio winUI 3 no tienen un CoreWindow, por lo que no se puede llamar a DataTransferManager.GetForCurrentView() ni DataTransferManager.ShowShareUI() directamente. En su lugar, use la interfaz COM de interoperabilidad IDataTransferManagerInterop para asociar el DataTransferManager con el identificador de su ventana y mostrar la interfaz de usuario para compartir. Para obtener ejemplos de código, consulte Mostrar objetos de interfaz de usuario de WinRT que dependen de CoreWindow. También puede consultar el ejemplo de aplicación de origen para compartir contenido de WPF para obtener una implementación completa.
Configuración de un controlador de eventos
Registre un controlador de eventos DataRequested en la DataTransferManager instancia. Este evento se desencadena cuando el usuario invoca Compartir, por ejemplo, cuando pulsa un botón Compartir en la aplicación o cuando la aplicación determina que hay contenido listo para compartir.
En el caso de las aplicaciones de escritorio de WinUI 3, obtenga el DataTransferManager para la ventana mediante IDataTransferManagerInterop, como se describe en Mostrar objetos de interfaz de usuario de WinRT que dependen de CoreWindow.
Proporcionar contenido en el controlador DataRequested
Cuando se produce un evento DataRequested , la aplicación recibe un objeto DataRequest que contiene un DataPackage que se rellena con el contenido que se va a compartir. Debe establecer un título y al menos un formato de datos. Una descripción es opcional, pero se recomienda.
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
DataRequest request = args.Request;
request.Data.Properties.Title = "Contoso article";
request.Data.Properties.Description = "An interesting article from Contoso.";
request.Data.SetText("Read this article at Contoso.com.");
request.Data.SetWebLink(new Uri("https://contoso.com/articles/1234"));
}
Advertencia
La propiedad Title es obligatoria. Si no establece un título, la operación de compartir falla.
Elegir formatos de datos
DataPackage admite varios formatos de datos integrados. Puedes proporcionar más de un formato en el mismo paquete: la aplicación receptora usa el formato que admita mejor.
| Formato | Método |
|---|---|
| Texto sin formato | SetText |
| Vínculos web | SetWebLink |
| Vínculos de aplicación | SetApplicationLink |
| HTML | SetHtmlFormat |
| Texto enriquecido (RTF) | SetRtf |
| Imágenes de mapa de bits | SetBitmap |
| Archivos y carpetas | SetStorageItems |
| Datos personalizados definidos por el desarrollador | SetData |
Configurar propiedades
DataPackagePropertySet permite adjuntar metadatos adicionales al contenido compartido. Agregar una miniatura proporciona a la hoja de recursos compartidos una vista previa visual más completa. Para obtener más información, consulte DataPackagePropertySet.
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
DataRequest request = args.Request; // The DataRequested event provides the request via args.Request.
request.Data.Properties.Title = "Sunset photo";
request.Data.Properties.Description = "Taken at Lake Tahoe.";
// Providing a thumbnail is optional but improves the share sheet preview.
// request.Data.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(thumbnailFile);
}
Inicio de la interfaz de usuario del recurso compartido
Tras registrarte para el DataRequestedevento, abre la hoja de compartir de Windows cuando el usuario active la función Compartir. Para las aplicaciones de escritorio de WinUI 3, llama a ShowShareUIForWindow en la interfaz IDataTransferManagerInterop, pasando el HWND de tu ventana. Para obtener ejemplos de código, consulte Mostrar objetos de interfaz de usuario de WinRT que dependen de CoreWindow.
Gestión de errores
Si la aplicación no puede proporcionar contenido que se puede compartir (por ejemplo, porque el usuario no ha seleccionado nada), llame a FailWithDisplayText para mostrar un mensaje informativo en la interfaz de usuario de recurso compartido:
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
if (string.IsNullOrEmpty(selectedText))
{
args.Request.FailWithDisplayText("Select some text in the app before sharing.");
return;
}
args.Request.Data.Properties.Title = "Selected text";
args.Request.Data.SetText(selectedText);
}
Retrasar la compartición con delegados
Si la generación de los datos del recurso compartido consume muchos recursos (por ejemplo, codificar una imagen grande en varias resoluciones), use un delegado para que los datos se generen solo cuando la aplicación receptora lo solicite. Esto evita el trabajo innecesario cuando el usuario aún no ha elegido un destino.
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
args.Request.Data.Properties.Title = "High-res photo";
args.Request.Data.SetDataProvider(StandardDataFormats.Bitmap, OnDeferredImageRequested);
}
// Note: DataProviderHandler requires async void. The try/finally ensures the
// deferral completes even if an exception occurs.
private async void OnDeferredImageRequested(DataProviderRequest request)
{
DataProviderDeferral deferral = request.GetDeferral();
try
{
if (this.imageStream == null)
{
return;
}
InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();
// Decode the source image and re-encode at 50% size.
BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(this.imageStream);
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));
}
finally
{
deferral.Complete();
}
}
Consulte también
- Recepción de datos compartidos en la aplicación de Windows
- Integración de aplicaciones empaquetadas con recursos compartidos de Windows
- Integración de aplicaciones sin empaquetar con recursos compartidos de Windows
- Mostrar objetos de interfaz de usuario de WinRT que dependen de CoreWindow
- IDataTransferManagerInterop
- DataTransferManager
- DataPackage
- DataRequest
- FailWithDisplayText
- Ejemplo de aplicación de origen para compartir contenido de WPF