Wpf 从剪贴板比较IDataObject
我的WPF应用程序检查剪贴板上的数据,看它是否可以处理这些数据。由于我根据数据(通过Wpf 从剪贴板比较IDataObject,wpf,c#-4.0,.net-4.0,clipboard,Wpf,C# 4.0,.net 4.0,Clipboard,我的WPF应用程序检查剪贴板上的数据,看它是否可以处理这些数据。由于我根据数据(通过ICommand实现)将一些按钮设置为启用/禁用,因此经常调用此代码 确定我的应用程序是否可以处理数据的工作有时是非常重要的,因此会导致我的应用程序随机“挂起”。我不相信我可以把这项工作推到另一个线程上,因为WPF运行时期望快速响应 为了解决这个问题,我想我会比较IDataObjects(剪贴板中的当前对象与上一次尝试中的缓存对象。直接比较(即使是对象。ReferenceEquals也不会返回所需的结果,因此我想
ICommand
实现)将一些按钮设置为启用/禁用,因此经常调用此代码
确定我的应用程序是否可以处理数据的工作有时是非常重要的,因此会导致我的应用程序随机“挂起”。我不相信我可以把这项工作推到另一个线程上,因为WPF运行时期望快速响应
为了解决这个问题,我想我会比较IDataObject
s(剪贴板中的当前对象与上一次尝试中的缓存对象。直接比较(即使是对象。ReferenceEquals
也不会返回所需的结果,因此我想尝试使用Clipboard.IsCurrent
方法。描述听起来正是我想要的,但当我评估以下内容时:
Clipboard.IsCurrent(Clipboard.GetDataObject())
结果是
false
。当前的解决方法是比较IDataObject上的数据格式,但这不是一个好答案,因为我的应用程序可以处理文件系统中的一些文件,但不是所有文件。因此,即使格式相同,但我的应用程序是否可以处理数据的结果可能并不总是相同的。 不幸的是,IsCurrent
不能与GetDataObject
一起工作(后者是IsCurrent
内部使用的),这一点非常明确:
OleIsCurrentClipboard仅适用于OleSetClipboard函数中使用的数据对象。数据对象的使用者无法调用它来确定上次OleGetClipboard调用时剪贴板上的对象是否仍在剪贴板上。
一种解决方法是订阅剪贴板更新(参见。
)只有在数据发生变化时才对其进行评估,可能是在后台线程中。是的,我最终使用了链接到的您身边的工作,但在您解释之前,我从未真正理解为什么
IsCurrent
无法按预期工作。谢谢!