我有一些代码旨在改变剪贴板上剪切/复制的内容,并且它完美适用于复制,但我无法让Cut工作。如何处理Cuting使用CopyingHandler时
在XAML中,我定义了一个名为rtbEditor RichTextBox的,在Loaded事件,我成立了CopyingHandler:
DataObject.AddPastingHandler(rtbEditor, new DataObjectPastingEventHandler(OnPaste));
DataObject.AddCopyingHandler(rtbEditor, new DataObjectCopyingEventHandler(OnCopy));
OnCopy是(简体):
private void OnCopy(object sender, DataObjectCopyingEventArgs e)
{
// Expand the selection include whole paragraphs only:
TextPointer newStart = rtbEditor.Selection.Start.Parapgraph.ContentStart;
TextPointer newEnd = rtbEditor.Selection.End.Paragraph.ContentEnd;
rtbEditor.Selection.Select(newStart, newEnd);
// copy the selected text
TextRange range = new TextRange(rtbEditor.Selection.Start, rtbEditor.Selection.End);
Clipboard.SetText(range.Text);
e.CancelCommand();
}
该作品复制的奇迹,但我遇到切割工作的问题。
我试着简单地用rtbEditor.Selection.Select()来扩展选择,就是这样,但包含复制数据的DataObject在CopyingHandler被调用时已经被填充,所以改变选择不会更改将放置在剪贴板中的内容。 (我仍然这样做的视觉反馈给用户,他们的选择已扩大)
如果我删除e.CancelCommand(),然后剪切将正确删除文本,但只有原本是而不是展开的选择,剪贴板将仅包含最初选择的文本,而不包含展开的选择。我假定,因为该命令没有取消,当剪切命令完成时,我的Clipboard.SetText()立即被DataObject的内容覆盖。
我也无法找到发件人或DataObjectCopyingEventArgs中的任何区别此事件是Cut事件还是复制事件,所以我可以让我的代码删除文本,如果它是Cut。
有没有办法在这里区分Cut和Copy,我没有看到?或者是否有一些事件可以吸引到这个过程的早期阶段? MSDN表示CopyingHandler会在“复制操作完成转换选定的内容时发生......”。但是在复制操作开始之前我找不到任何事件。或者我需要以完全不同的方式来解决这个问题?
我发现这是一个类似的问题在How to override copy and paste in richtextbox的意见,但没有答案,有