如何在RichTextBox中重写复制和粘贴功能

7

如何在C#应用程序中覆盖RichTextBox的复制/粘贴功能,包括ctrl-c / ctrl-v和右键单击复制/粘贴。

它是WPF RichTextBox。


对于 Windows Forms,请参见:https://dev59.com/kG035IYBdhLWcg3wHsKR对于 WPF,请参见:https://dev59.com/7HA75IYBdhLWcg3w3NHf - Davide Piras
@Davide,WPF链接添加了一个处理程序,但它没有覆盖它。 - raym0nd
3个回答

18

覆盖命令函数的方法:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{
  if (keyData == (Keys.Control | Keys.C))
  {
    //your implementation
    return true;
  } 
  else if (keyData == (Keys.Control | Keys.V))
  {
    //your implementation
    return true;
  } 
  else 
  {
    return base.ProcessCmdKey(ref msg, keyData);
  }
}

在Winforms RichTextBox中不支持右键点击。

--编辑--

后来才意识到这是一个WPF问题。要在WPF中实现这个功能,您需要附加自定义的复制和粘贴处理程序:

DataObject.AddPastingHandler(myRichTextBox, MyPasteCommand);
DataObject.AddCopyingHandler(myRichTextBox, MyCopyCommand);

private void MyPasteCommand(object sender, DataObjectEventArgs e)
{
    //do stuff
}

private void MyCopyCommand(object sender, DataObjectEventArgs e)
{
    //do stuff
}

你知道如何在WPF中实现吗? - raym0nd
@Ediwn,你所拥有的WPF内容添加了一个处理程序,但并没有覆盖主要的复制/粘贴操作,它们仍然会被调用。 - raym0nd
3
你可以添加'e.CancelCommand();'来防止默认的复制/粘贴... - Edwin de Koning
@EdwindeKoning 对于Windows Forms,这种方法可能适用于CTRL+V,但不适用于SHIFT+INSERT,这也是一种标准的粘贴键组合。当然,使用您的示例,扩展解决方案以支持此功能将更容易。 - CJBS

4
使用复制和粘贴处理程序时如何剪切?当您拥有自定义的OnCopy实现并通过其进行处理时,您可以如何剪切?

e.Handled = true;
e.CancelCommand();

在执行剪切操作时也会调用 OnCopy 方法 - 我找不到方法来确定是执行了复制还是剪切。


1
我也不知道是复制还是剪切。 - Jeson Martajaya

2
我使用了以下代码:
//doc.Editor 是 RichtextBox。
 DataObject.AddPastingHandler(doc.Editor, new DataObjectPastingEventHandler(OnPaste));
 DataObject.AddCopyingHandler(doc.Editor, new DataObjectCopyingEventHandler(OnCopy));



    private void OnPaste(object sender, DataObjectPastingEventArgs e)
    { 

    }
    private void OnCopy(object sender, DataObjectCopyingEventArgs e)
    {

    }

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