System.Windows.Clipboard和System.Windows.Forms.Clipboard有什么区别?

14
System.Windows.Clipboard和System.Windows.Forms.Clipboard之间有何区别?
System.Windows.Forms版本的文档明确说明,要将对象存储到剪贴板上,该对象必须是可序列化的,并且您的应用程序必须具有STA模型,但是System.Windows版本的文档没有列出这两个作为先决条件。这是真的吗?为什么有两个类?它们有何不同?
如果这很重要,我们的应用程序是WPF,并且我知道前者是针对WPF而设计的,而后者是针对Windows.Forms而设计的……但是为什么?为什么不始终使用System.Windows版本,即使在基于窗体的应用程序中也是如此,考虑到它只是一个引用,在使用方面更不受限制,而.NET中的对象只是一个对象。

我们有一个WinForms代码,自古以来一直使用System.Windows.Clipboard,现在才开始出问题。切换到System.Windows.Forms.Clipboard解决了这个问题。为什么? - Corey Alix
这是我的问题! :) - Mark A. Donohoe
2个回答

8
简单来说:System.Windows.Clipboard(在PresentationCore.dll中)是为WPF设计的,而System.Windows.Forms.Clipboard(在System.Windows.Forms.dll中)则适用于Windows Forms。
你会经常在这两个程序集中遇到看似相同的类;这是因为WPF和WinForms基于足够不同的系统,许多框架API必须以不同的方式实现。我自己并没有真正使用过系统剪贴板,但我猜想它可能与WinForms相对接近低级Win32 API有关。不过我不确定。
由于你正在使用WPF,所以应该使用System.Windows.Clipboard,因为WPF的实现与WinForms不同。

2
虽然我知道应该在各自的平台上使用它们,但这并不能解释它们之间的区别,以及为什么一侧有限制而另一侧没有,尽管它们都是基于相同的 COM 剪贴板。这就是我想知道的。例如,既然 System.Windows 版本似乎要少得多限制,为什么甚至 Windows Forms 应用程序也不使用它呢? - Mark A. Donohoe
我认为不会有比这更好的答案了,所以我会接受你的答案。不过,关于序列化问题,我不知道文档中是否存在错误,或者在WPF版本中是否允许使用非可序列化版本的数据。 - Mark A. Donohoe

0

System.Windows 命名空间是关于 WPF(Windows 中创建 GUI 的新方式),而 System.Windows.Forms 命名空间包含有关 Forms(旧样式)的元素。


请看我对@BoltClock的评论,简而言之,那并没有解释区别,只是解释用法。 - Mark A. Donohoe
我认为区别在于WPF直接使用DirectX来处理UI,而Forms则使用GDI+。因此,WPF可能会使用多个线程来处理GPU和其他组件。 - Mert Akcakaya
1
但剪贴板与UI无关。它是幕后的数据,所以这方面的任何事情都不应该有影响。 - Mark A. Donohoe
你尝试在Forms应用程序中使用WPF剪贴板了吗?由于线程安全>非线程安全,也许它可以工作。 - Mert Akcakaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接