比较剪贴板中的IDataObject

时间:2013-02-21 19:35:17

标签: wpf c#-4.0 .net-4.0 clipboard

我的WPF应用程序检查剪贴板上的数据,看它是否可以处理数据。因为我根据数据设置了一些按钮来启用/禁用(通过ICommand实现),所以经常调用此代码。

确定我的应用程序是否可以处理数据的工作有时是非常重要的,因此导致我的应用程序随机“挂起”。我不相信我可以把这项工作推到另一个线程,因为WPF运行时期待快速响应。

为了解决这个问题,我想我会比较IDataObject s(剪贴板中的当前一个与上一次尝试中的缓存一个。直接比较(甚至是object.ReferenceEquals }没有返回所需的结果,所以我想我会尝试方法Clipboard.IsCurrent。描述听起来就像我想要的那样,但当我评估以下内容时:

Clipboard.IsCurrent(Clipboard.GetDataObject())

结果是false。目前的解决方法是比较IDataObject上的数据格式,但这不是一个好的答案,因为我的应用程序可以处理文件系统中的某些文件,但不是全部。因此,即使格式相同,我的应用程序是否可以处理数据的结果可能并不总是相同。

1 个答案:

答案 0 :(得分:3)

不幸的是,IsCurrent无法与GetDataObject一起使用。 MSDN's description of OleIsCurrentClipboardIsCurrent内部使用)对此非常明确:

OleIsCurrentClipboard仅适用于OleSetClipboard函数中使用的数据对象。 数据对象的使用者无法调用它来确定前一个OleGetClipboard调用中剪贴板上的对象是否仍在剪贴板上。

解决方法可能是订阅剪贴板更新(请参阅例如 Clipboard event C#)并仅在数据发生变化时评估数据,可能是在后台线程中。