В качестве документа Примечания часть:
Используйте метод SetDataProvider, когда ваше приложение поддерживает определенный формат, но не хочет предоставлять данные, пока целевое приложение не запросит их.
Поэтому, если вы хотите получить контент, вы должны использовать DataPackageView Class и использовать соответствующий метод для его получения. В качестве примера для формата StandardDataFormats.Html
,
При копировании содержимого HTML:
static void CopyToClipboardReference(string s)
{
DataPackage dataPackage = new DataPackage();
reference = s;
dataPackage.SetDataProvider(StandardDataFormats.Html, CopyToClipboardAction);
Clipboard.SetContent(dataPackage);
}
static string reference;
static void CopyToClipboardAction(DataProviderRequest request)
{
//Called immediately!
request.SetData(reference);
}
private void CopyButton_Click(object sender, RoutedEventArgs e)
{
CopyToClipboardReference("<Html><Body><h1>Load html string.<h1><Body></Html>");
}
Чтобы получить содержимое, вы должны вызвать DataPackageView.GetHtmlFormatAsync , чтобы получить его, тогда будет вызван обратный вызов CopyToClipboardAction
.
async void PasteButton_Click(object sender, RoutedEventArgs e)
{
var data = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();
if (data.Contains(StandardDataFormats.Html))
{
string htmlFormat = null;
{
htmlFormat = await data.GetHtmlFormatAsync();
}
}
}
Но что касается формата StandardDataFormats.Text
, обратный вызов CopyToClipboardAction
будет повышен дважды, я не уверен, что он задуман, и я это подтвердлю.
С другой стороны, если ваш вопрос о событии DataTransfer.OperationCompleted
не возник, вы можете увидеть подробный ответ в другой ветке ( Событие OperationCompleted не возникает после операции вставки ) чтобы вызвать следующий код в вашем методе обработчика вставки.
dataPackageView.ReportOperationCompleted(DataPackageOperation.Copy);