Поделиться

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

Примечание.

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

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

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

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

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

DataRequest request = args.Request;

Выберите дату

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

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

Объект 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();
    }
}

См. также