Поделиться через


Поделиться данными

В этой статье объясняется, как поддерживать контракт общего доступа на рабочем столе или в приложении универсальной платформы Windows (UWP). Контракт "Общий доступ" — это простой способ быстрого обмена данными ( например, текстом, ссылками, фотографиями и видео) между приложениями. Например, пользователю может потребоваться поделиться веб-страницей со своими друзьями с помощью приложения социальных сетей или сохранить ссылку в приложении заметок для дальнейшего использования.

Замечание

Примеры кода, приведенные в этой статье, относятся к приложениям UWP. Настольные приложения должны использовать IDataTransferManagerInterop. Дополнительные сведения и примеры кода см. в разделе "Отображение объектов пользовательского интерфейса WinRT", зависящих от CoreWindow.

Вы также можете ознакомиться с образцом приложения WPF для обмена содержимым и с интеграцией опций обмена в приложении Windows для получения дополнительных сведений о совместном доступе к данным в настольных приложениях.

Настройка обработчика событий

Добавьте обработчик событий DataRequested , который будет вызываться всякий раз, когда пользователь вызывает общий ресурс. Это может произойти, если пользователь нажимает элемент управления в приложении (например, кнопку или команду панели приложений) или автоматически в определенном сценарии (если пользователь завершает уровень и получает высокую оценку, например).

DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += DataTransferManager_DataRequested;

При возникновении события DataRequested приложение получает объект DataRequest . Он содержит DataPackage , который можно использовать для предоставления содержимого, к которому пользователь хочет предоставить общий доступ. Для предоставления общего доступа необходимо указать название и данные. Описание является необязательным, но рекомендуется.

DataRequest request = args.Request;

Выбор данных

Вы можете совместно использовать различные типы данных, в том числе:

  • Обычный текст
  • Универсальные идентификаторы ресурсов (URI)
  • HTML
  • Форматированный текст
  • Растровые изображения
  • Files
  • Настраиваемые данные, определенные разработчиком

Объект DataPackage может содержать один или несколько из этих форматов в любом сочетании. В следующем примере показан общий доступ к тексту.

request.Data.SetText("Hello world!");

Установить свойства

При пакете данных для общего доступа можно указать различные свойства, которые предоставляют дополнительные сведения о содержимом, к которому предоставляется общий доступ. Эти свойства помогают целевым приложениям улучшить взаимодействие с пользователем. Например, описание помогает, когда пользователь предоставляет общий доступ к содержимому с несколькими приложениями. Добавление эскиза при совместном использовании изображения или ссылки на веб-страницу предоставляет визуальный ориентир пользователю. Дополнительные сведения см. в разделе DataPackagePropertySet.

Предупреждение

Все свойства, кроме заголовка, являются необязательными. Свойство "title" является обязательным и должно быть задано.

request.Data.Properties.Title = "Share Example";
request.Data.Properties.Description = "A demonstration on how to share";

Запуск интерфейса обмена

Пользовательский интерфейс для общего доступа предоставляется системой. Чтобы запустить его, вызовите метод ShowShareUI .

DataTransferManager.ShowShareUI();

Управление ошибками

В большинстве случаев общий доступ к содержимому является простым процессом. Однако всегда есть вероятность того, что что-то неожиданное может произойти. Например, приложению может потребоваться, чтобы пользователь выбрал содержимое для общего доступа, но пользователь не выбрал его. Чтобы справиться с этими ситуациями, используйте метод FailWithDisplayText , который отобразит сообщение пользователю, если что-то пошло не так.

Задержка передачи информации делегатам

Иногда может быть нецелесообразно сразу подготавливать данные, которыми пользователь хочет поделиться. Например, если приложение поддерживает отправку большого файла изображения в нескольких различных возможных форматах, то неэффективно создавать все эти изображения, прежде чем пользователь сделает выбор.

Чтобы решить эту проблему, DataPackage может содержать делегат — функцию, которая вызывается, когда приложение-запрашиватель данных запрашивает данные. Рекомендуется использовать делегат в тех случаях, когда данные, к которым пользователь хочет предоставить общий доступ, являются ресурсоемкими.

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();
    }
}

См. также