WPF剪贴板操作期间的数据丢失

时间:2010-07-20 19:21:03

标签: c# wpf xaml serialization clipboard

我正在使用WPF FlowDocument中的RichTextBox。一些流文档元素是使用System.Windows.Documents框架类的子类创建的,并且所有元素都使用Tag属性来存储其他数据。

如果我使用XamlWriter序列化文档树,则所有内容都会正确反映在生成的Xaml输出中。

但是,如果我只是在RichTextBox内复制并粘贴,虽然粘贴的元素在视觉上与复制它们的元素相同,但剪贴板操作会丢弃所有其他数据。具体来说,所有子类化元素都被粘贴为其基本框架类型的实例,并且它们都没有在Tag属性中包含数据。

这表明RichTextBox上的WPF剪贴板操作不使用XamlWriter进行序列化,尽管序列化剪贴板数据将其格式标识为“Xaml”。

我认为这种行为的原因是为了确保在粘贴到其他不一定了解我的自定义类型的Xaml感知应用程序时有一个共同点。但我需要实现更丰富的复制/粘贴机制,以便在我的应用程序中使用。

我想我可能会截取复制事件并以自定义格式添加剪贴板数据,随后会在粘贴事件中应用。但是,这会带来复杂性,因为元素可能需要在粘贴之前进行换行(例如,粘贴到块元素上下文中的内联元素)。

所以,我希望避免重新发明轮子,并希望了解如何使用现有的框架基础设施来实现这一点。

1 个答案:

答案 0 :(得分:0)

我对你的问题没有确切的答案,但我可以想到两种方法 -

  1. 关联CommandBinding 复制/粘贴操作,与您的 控制和执行自定义 ExecuteCanExecute中的操作 方法。如下所述:

      

    http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

  2. 使用DataObject类进行拦截 复制/粘贴事件并执行     你的自定义操作。即     DataObject.AddCopyingHandler     和     DataObject.AddPastingHandler

    一些有用的链接 -

      

    http://msdn.microsoft.com/en-us/library/system.windows.dataobject_members.aspx

         

    http://blogs.msdn.com/b/prajakta/archive/2006/11/28/auto-detecting-hyperlinks-in-richtextbox-part-ii.aspx

  3. 希望这会有所帮助。