Compartilhar dados
Este artigo explica como dar suporte ao contrato de Compartilhamento em um desktop ou aplicativo da Plataforma Universal do Windows (UWP). O contrato de Compartilhamento é uma maneira fácil de compartilhar dados como texto, links, fotos e vídeos entre aplicativos rapidamente. 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.
Observação
Os exemplos de código neste artigo são de aplicativos UWP. Os aplicativos da área de trabalho devem usar o IDataTransferManagerInterop. Para saber mais e ver exemplos de código, confira Exibir objetos da interface do usuário do WinRT que dependem do CoreWindow. Confira também o exemplo de aplicativo de origem de conteúdo de compartilhamento do WPF.
Configurar um manipulador de eventos
Adicione um manipulador de eventos DataRequested a ser chamado sempre que um usuário invocar o compartilhamento. Isso pode ocorrer quando o usuário toca em um controle no seu aplicativo (como um botão ou comando da barra de aplicativos) ou automaticamente em um cenário específico (se o usuário terminar um nível e receber uma pontuação alta, por exemplo).
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += DataTransferManager_DataRequested;
Quando ocorre um evento DataRequested, o aplicativo recebe um objeto DataRequest. Ele contém um DataPackage que você pode usar para fornecer o conteúdo que o usuário deseja compartilhar. Você deve fornecer um título e dados para compartilhar. Uma descrição é opcional, mas recomendada.
DataRequest request = args.Request;
Escolher dados
Você pode compartilhar vários tipos de dados, inclusive:
- Texto sem formatação
- Uniform Resource Identifiers (URIs)
- HTML
- Texto formatado
- Bitmaps
- Arquivos
- Dados personalizados definidos pelo desenvolvedor
O objeto DataPackage pode conter um ou mais desses formatos, em qualquer combinação. O exemplo a seguir demonstra o texto de compartilhamento.
request.Data.SetText("Hello world!");
Definir propriedades
Ao empacotar dados para compartilhamento, você pode fornecer uma variedade de propriedades que fornecem informações adicionais sobre o conteúdo que está sendo compartilhado. Essas propriedades ajudam os aplicativos de destino a melhorar a experiência do usuário. Por exemplo, uma descrição ajuda quando o usuário está compartilhando conteúdo com mais de um aplicativo. Adicionar uma miniatura ao compartilhar uma imagem ou um link para uma página da Web fornece uma referência visual ao usuário. Para obter mais informações, confira DataPackagePropertySet.
Aviso
Todas as propriedades, exceto o título, são opcionais. A propriedade do título é obrigatória e deve ser definida.
request.Data.Properties.Title = "Share Example";
request.Data.Properties.Description = "A demonstration on how to share";
Iniciar a interface do usuário de compartilhamento
Uma interface do usuário para compartilhamento é fornecida pelo sistema. Para iniciá-la, chame o método ShowShareUI.
DataTransferManager.ShowShareUI();
Tratar erros
Na maioria dos casos, o compartilhamento de conteúdo é um processo simples. No entanto, sempre há uma chance de que algo inesperado possa acontecer. Por exemplo, o aplicativo pode exigir que o usuário selecione conteúdo para compartilhamento, mas o usuário não selecionou. Para lidar com essas situações, use o método FailWithDisplayText, que exibirá uma mensagem para o usuário se algo der errado.
Atrasar compartilhamento com delegados
Às vezes, pode não fazer sentido preparar os dados que o usuário deseja compartilhar imediatamente. Por exemplo, se seu aplicativo permite o envio de um arquivo de imagem grande em vários formatos possíveis diferentes, será ineficiente criar todas essas imagens antes que o usuário faça sua seleção.
Para resolver esse problema, um DataPackage pode conter um delegado, uma função que é chamada quando o aplicativo de recebimento solicita dados. Recomendamos o uso de um delegado sempre que os dados que um usuário deseja compartilhar consumirem muitos 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();
}
}