Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье объясняется, как поддерживать контракт общего доступа на рабочем столе или в приложении универсальной платформы 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();
}
}