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);