Поделиться
В этой статье объясняется, как поддерживать контракт 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();
}
}