我的WPF应用程序检查剪贴板上的数据,看它是否可以处理数据。因为我根据数据设置了一些按钮来启用/禁用(通过ICommand
实现),所以经常调用此代码。
确定我的应用程序是否可以处理数据的工作有时是非常重要的,因此导致我的应用程序随机“挂起”。我不相信我可以把这项工作推到另一个线程,因为WPF运行时期待快速响应。
为了解决这个问题,我想我会比较IDataObject
s(剪贴板中的当前一个与上一次尝试中的缓存一个。直接比较(甚至是object.ReferenceEquals
}没有返回所需的结果,所以我想我会尝试方法Clipboard.IsCurrent
。描述听起来就像我想要的那样,但当我评估以下内容时:
Clipboard.IsCurrent(Clipboard.GetDataObject())
结果是false
。目前的解决方法是比较IDataObject上的数据格式,但这不是一个好的答案,因为我的应用程序可以处理文件系统中的某些文件,但不是全部。因此,即使格式相同,我的应用程序是否可以处理数据的结果可能并不总是相同。
答案 0 :(得分:3)
不幸的是,IsCurrent
无法与GetDataObject
一起使用。 MSDN's description of OleIsCurrentClipboard
(IsCurrent
内部使用)对此非常明确:
OleIsCurrentClipboard仅适用于OleSetClipboard函数中使用的数据对象。 数据对象的使用者无法调用它来确定前一个OleGetClipboard调用中剪贴板上的对象是否仍在剪贴板上。
解决方法可能是订阅剪贴板更新(请参阅例如 Clipboard event C#)并仅在数据发生变化时评估数据,可能是在后台线程中。