Richtextbox - 撤消?

时间:2013-04-23 15:51:15

标签: c# .net wpf richtextbox

我需要能够检测是否已触发“撤消”,以及它是否对我RichTextBox的内容产生了影响。

我在内容中将内容输入RichTextBox,然后按 Ctrl + Z ,Windows似乎为我处理了撤消操作。我希望能够编写将在此之后直接触发的代码。我一直环顾四周,找不到任何东西。

提前致谢。

5 个答案:

答案 0 :(得分:2)

从.Net 3.0开始,有一种简单的内置方法可以在执行撤销命令(以及其他命令)时收到通知:

CommandManager.RegisterClassCommandBinding(typeof(MyClass),
    new CommandBinding(ApplicationCommands.Undo, OnUndo));

只需在静态构造函数(或其他地方)中调用此行代码并添加静态方法:

private static void OnUndo(object sender, ExecutedRoutedEventArgs e)
{
    //your code
}

答案 1 :(得分:1)

<强> WINFORM

您可以利用KeyDown事件并检测是否按下 Ctrl + Z

richTextBox.KeyDown += new KeyEventHandler(richTextBox_KeyDown);

private void richTextBox_KeyDown(object sender, KeyEventArgs e){
    if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Z){
        //undo detected, do something
    }
}

WPF

richTextBox.KeyUp += new KeyEventHandler(richTextBox_KeyUp);

void richTextBox_KeyUp(object sender, KeyEventArgs e) {
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Z) {
        //undo detected, do something
    }
}

答案 2 :(得分:0)

我认为你将不得不implement that yourself。我不知道开箱即用的事件会满足你的需求。

您可能还想查看Monitored Undo Frameworkhere进行额外阅读。

答案 3 :(得分:0)

如果我理解你,你想比较Ctr+Z之前和之后的内容。

然后你应该这样做:

在XAML文件中:

<RichTextBox PreviewKeyDown="RichTextBox_PreviewKeyDown" KeyUp="RichTextBox_KeyUp" />

在CS档案中:

private void RichTextBox_KeyUp(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Z)
    {
        Console.WriteLine("After : " + new TextRange(((RichTextBox)sender).Document.ContentStart, ((RichTextBox)sender).Document.ContentEnd).Text);
    }
}

private void RichTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Z)
    {
        Console.WriteLine("Before : " + new TextRange(((RichTextBox)sender).Document.ContentStart, ((RichTextBox)sender).Document.ContentEnd).Text);
    }
}

然后,您将在应用程序的输出中看到RichTextBox在Ctrl+Z之前的内容以及之后的内容。

我试过了,它运作正常!

答案 4 :(得分:0)

如上所述,可以使用CommandBindings。我更喜欢绑定到每个control而不是绑定到特定类的所有控件。这可以通过以下方式完成:

this.richTextBox.CommandBindings.Add(
    new CommandBinding(ApplicationCommands.Undo, this.RichTextBoxUndoEvent));


private void RichTextBoxUndoEvent(object sender, ExecutedRoutedEventArgs e)
{
    e.Handled = true;
    this.richTextBox.Undo();
}