我的 WPF 应用程序检查剪贴板上的数据,看看它是否可以使用该数据。因为我根据数据设置了一些按钮来启用/禁用(通过ICommand
实现),这段代码被频繁调用。
确定我的应用程序是否可以处理数据的工作有时可能非常重要,因此会导致我的应用程序随机“挂起”。我不相信我可以将这项工作推到另一个线程,因为 WPF 运行时期望快速响应。
为了解决这个问题,我想我应该比较一下IDataObject
s(剪贴板中的当前值与上一次尝试中的缓存值。直接比较(甚至是object.ReferenceEquals
没有返回想要的结果,所以我想我会尝试这个方法Clipboard.IsCurrent
。该描述听起来正是我想要的,但是当我评估以下内容时:
Clipboard.IsCurrent(Clipboard.GetDataObject())
结果是false
。当前的解决方法是比较 IDataObject 上的数据格式,但这不是一个好的答案,因为我的应用程序可以处理文件系统中的某些文件,但不是全部。因此,即使格式相同,我的应用程序是否可以处理数据的结果可能并不总是相同。
很遗憾,IsCurrent
不能同时使用GetDataObject
. MSDN 的描述OleIsCurrentClipboard http://msdn.microsoft.com/de-de/library/windows/desktop/ms679667%28v=vs.85%29.aspx (which IsCurrent
内部使用)对此非常明确:
OleIsCurrentClipboard 仅适用于 OleSetClipboard 函数中使用的数据对象。数据对象的使用者无法调用它来确定上次 OleGetClipboard 调用时剪贴板上的对象是否仍在剪贴板上。
解决方法可能是订阅剪贴板更新(参见例如剪贴板事件 C# https://stackoverflow.com/questions/621577/clipboard-event-c-sharp)并仅在数据更改时评估数据(可能在后台线程中)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)