DataPackage.SetDataProvider不等待(与其文档状态不同)

DataPackage.SetDataProvider的文档说明:

当您的应用程序…在目标应用程序请求之前不想提供数据时,请使用SetDataProvider方法。

但是当我运行以下代码时,它会立即调用回调方法。

static void CopyToClipboardReference(string s) { DataPackage dataPackage = new DataPackage(); reference = s; dataPackage.SetDataProvider(StandardDataFormats.Text, CopyToClipboardAction); Clipboard.SetContent(dataPackage); } static string reference; static void CopyToClipboardAction(DataProviderRequest request) { //Called immediately! request.SetData(reference); } 

当我将StandardDataFormats.Text更改为StandardDataFormats.Html它确实按预期工作(延迟呈现)但是我没有在记事本等应用程序中获得“粘贴”选项。

我如何让它等待文本,直到它从目标应用程序调用,因为它应该按照其文档进行操作?

另外

不会引发DataTransfer.OperationCompleted事件。

Clipboard与其他共享选项略有不同,因为它是一个系统范围的function,它可以在任何地方使用。 我想这是立即执行CopyTOClipboardAction的原因,因为用户可能也想立即使用剪贴板。

这也是有道理的,因为用户可能想要设置剪贴板内容 ,然后在粘贴之前关闭应用程序 。 这实际上意味着数据必须存在,因为系统不能再在以后设置内容。

正如文件备注部分:

当您的应用支持特定格式时,请使用SetDataProvider方法,但在目标应用请求之前不希望提供数据。

因此,如果您想获取内容,则应使用DataPackageView类并使用相应的方法来获取它。 作为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("

Load html string.

"); }

要获取内容,您应该调用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事件的问题,您可以在另一个线程中看到详细的答案( ‘Paste’操作后未提出的’OperationCompleted’事件 )来调用粘贴处理程序中的以下代码方法。

 dataPackageView.ReportOperationCompleted(DataPackageOperation.Copy);