2017-07-14 31 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標誌來判斷它是剪切還是複製操作。