Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 从剪贴板比较IDataObject_Wpf_C# 4.0_.net 4.0_Clipboard - Fatal编程技术网

Wpf 从剪贴板比较IDataObject

Wpf 从剪贴板比较IDataObject,wpf,c#-4.0,.net-4.0,clipboard,Wpf,C# 4.0,.net 4.0,Clipboard,我的WPF应用程序检查剪贴板上的数据,看它是否可以处理这些数据。由于我根据数据(通过ICommand实现)将一些按钮设置为启用/禁用,因此经常调用此代码 确定我的应用程序是否可以处理数据的工作有时是非常重要的,因此会导致我的应用程序随机“挂起”。我不相信我可以把这项工作推到另一个线程上,因为WPF运行时期望快速响应 为了解决这个问题,我想我会比较IDataObjects(剪贴板中的当前对象与上一次尝试中的缓存对象。直接比较(即使是对象。ReferenceEquals也不会返回所需的结果,因此我想

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

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

为了解决这个问题,我想我会比较
IDataObject
s(剪贴板中的当前对象与上一次尝试中的缓存对象。直接比较(即使是
对象。ReferenceEquals
也不会返回所需的结果,因此我想尝试使用
Clipboard.IsCurrent
方法。描述听起来正是我想要的,但当我评估以下内容时:

Clipboard.IsCurrent(Clipboard.GetDataObject())

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

不幸的是,
IsCurrent
不能与
GetDataObject
一起工作(后者是
IsCurrent
内部使用的),这一点非常明确:

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

一种解决方法是订阅剪贴板更新(参见。
)只有在数据发生变化时才对其进行评估,可能是在后台线程中。

是的,我最终使用了链接到的您身边的工作,但在您解释之前,我从未真正理解为什么
IsCurrent
无法按预期工作。谢谢!