【问题标题】:Comparing IDataObject from the Clipboard比较剪贴板中的 IDataObject
【发布时间】:2013-02-21 19:35:16
【问题描述】:

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

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

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

Clipboard.IsCurrent(Clipboard.GetDataObject())

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

【问题讨论】:

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


    【解决方案1】:

    很遗憾,IsCurrent 不能与 GetDataObject 一起使用。 MSDN's description of OleIsCurrentClipboardIsCurrent 在内部使用)对此非常明确:

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

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

    【讨论】:

    • 是的,我最终使用了与您相关的工作,尽管在您解释之前我从未真正理解为什么 IsCurrent 没有按预期工作。谢谢!
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多