Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O contrato Windows Share permite aos utilizadores partilhar rapidamente conteúdos — como texto, links, fotos e vídeos — da sua aplicação para outras aplicações. Por exemplo, um usuário pode querer compartilhar uma página da Web com seus amigos usando um aplicativo de rede social ou salvar um link em um aplicativo de anotações para consultar mais tarde.
Este artigo explica como implementar o lado fonte do contrato de partilha: o código que prepara o conteúdo e abre a Folha de Partilha do Windows a partir da sua aplicação. Para informações sobre como receber conteúdo partilhado, consulte Receber dados partilhados na sua aplicação Windows.
As Windows.ApplicationModel.DataTransfer APIs usadas neste artigo funcionam para aplicações que têm identidade de pacote, incluindo aplicações UWP e aplicações de desktop WinUI 3 empacotadas. Aplicações Win32 não empacotadas podem participar concedendo identidade de pacote e depois usando IDataTransferManagerInterop.
Observação
As aplicações de desktop do WinUI 3 não têm CoreWindow, por isso não é possível chamar DataTransferManager.GetForCurrentView() nem DataTransferManager.ShowShareUI() diretamente. Em vez disso, utilize a interface COM de interoperabilidade IDataTransferManagerInterop para associar o DataTransferManager ao identificador da sua janela e mostrar a interface do utilizador de partilha. Para exemplos de código, veja Exibir objetos da interface WinRT que dependem do CoreWindow. Pode também consultar o exemplo da aplicação fonte de conteúdo WPF Sharing para uma implementação completa.
Configurar um manipulador de eventos
Regista um gestor de eventos DataRequested na tua DataTransferManager instância. Este evento é ativado quando o utilizador invoca o Partilhar—por exemplo, quando toca num botão de Partilhar na sua aplicação, ou quando a sua aplicação determina que há conteúdo pronto para partilhar.
Para aplicações de desktop WinUI 3, obtenha-o DataTransferManager para a sua janela usando IDataTransferManagerInterop, conforme descrito em Mostrar objetos de UI WinRT que dependem do CoreWindow.
Fornecer conteúdo no handler DataRequested
Quando ocorre um evento DataRequested , a sua aplicação recebe um objeto DataRequest contendo um DataPackage que preenche com o conteúdo para partilhar. Deve definir um título e pelo menos um formato de dados. Uma descrição é opcional, mas recomendada.
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"));
}
Warning
A propriedade Title é obrigatória. Se não definir um título, a operação de partilha falha.
Escolha formatos de dados
O DataPackage suporta múltiplos formatos de dados incorporados. Pode fornecer mais do que um formato no mesmo pacote — a aplicação recetora usa o formato que melhor suporta.
| Formato | Method |
|---|---|
| Texto simples | SetText |
| Ligações web | SetWebLink |
| Ligações de aplicação | SetApplicationLink |
| HTML | SetHtmlFormat |
| Texto enriquecido (RTF) | SetRtf |
| Imagens bitmap | SetBitmap |
| Ficheiros e pastas | SetStorageItems |
| Dados personalizados definidos pelo desenvolvedor | SetData |
Definir propriedades
O DataPackagePropertySet permite-lhe anexar metadados adicionais ao conteúdo partilhado. Adicionar uma miniatura dá à folha de partilhas uma pré-visualização visual mais rica. Para mais informações, 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);
}
Iniciar a interface de compartilhamento
Depois de se registar no evento DataRequested, abra o painel de partilha do Windows quando o utilizador acionar a partilha. Para aplicações WinUI 3 de ambiente de trabalho, chama ShowShareUIForWindow na interface IDataTransferManagerInterop, passando o HWND da sua janela. Para exemplos de código, veja Exibir objetos da interface WinRT que dependem do CoreWindow.
Lidar com erros
Se a sua aplicação não conseguir fornecer conteúdo partilhável — por exemplo, porque o utilizador não selecionou nada — chame FailWithDisplayText para mostrar uma mensagem informativa na IU de partilha:
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);
}
Adiar a partilha com os delegados
Se a produção dos dados partilhados for intensiva em recursos — por exemplo, codificar uma imagem grande em múltiplas resoluções — use um delegado para que os dados sejam produzidos apenas quando a aplicação recetora os solicita. Isto evita trabalho desnecessário quando o utilizador ainda não escolheu um alvo.
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 também
- Receba dados partilhados na sua aplicação Windows
- Integra aplicações empacotadas com Windows Share
- Integre aplicativos não empacotados com o Compartilhamento do Windows
- Exibir objetos da interface do usuário do WinRT que dependem de CoreWindow
- IDataTransferManagerInterop
- DataTransferManager
- Pacote de dados
- DataRequest
- FailWithDisplayText
- Exemplo de aplicação de fonte de conteúdo partilhado WPF
Windows developer