2

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

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

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

Clipboard.IsCurrent(Clipboard.GetDataObject())

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

4

1 回答 1

3

不幸的是,IsCurrent不能与GetDataObject. MSDN 对OleIsCurrentClipboardIsCurrent内部使用)的描述对此非常明确:

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

一种解决方法可能是订阅剪贴板更新(参见例如 剪贴板事件 C#)并仅在数据更改时评估数据,可能在后台线程中。

于 2013-08-13T05:54:22.967 回答