2017-07-14 59 views
2

我有一些代码旨在改变剪贴板上剪切/复制的内容,并且它完美适用于复制,但我无法让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的意见,但没有答案,有

回答

0

以下是我最后解决问题。我发现this page在执行之前描述了拦截命令。在XAML

(在Make WPF textbox as cut, copy and paste restricted问题的答案也提到过)我退出RichTextBox的为CommandManager.PreviewExecuted添加事件:

<RichTextBox Name="rtbEditor" ... CommandManager.PreviewExecuted="rtbEditor_PreviewExecuted" > 

rtbEditor_PreviewExecuted被称为每当任何命令即将在rtbEditor执行。我拦截Cut和Copy事件并将逻辑放在那里以将选择扩展为仅段落,并向我的MainWindow类添加一个布尔标志来标记传入事件是Cut还是Copy。

private void rtbEditor_PreviewExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    if (e.Command == ApplicationCommands.Copy) 
    { 
     ExpandSelectionForCopy(); 
     mHandlingCutAction = false; 
    } 
    else if(e.Command == ApplicationCommands.Cut) 
    { 
     ExpandSelectionForCopy(); 
     mHandlingCutAction = true; 
    } 
} 

这让我之前更改RichTextBox中选择内置的剪切/复制逻辑得到了它,所以由CopyingHandler被调用的时候,选择已经扩大和数据对象正确填写。

特殊处理的额外逻辑仍然可以添加到CopyingHandler,使用mHandlingCutAction标志来判断它是剪切还是复制操作。