2

我需要能够检测是否触发了“撤消”,以及它是否对我的RichTextBox.

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

提前致谢。

4

5 回答 5

2

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

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

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

private static void OnUndo(object sender, ExecutedRoutedEventArgs e)
{
    //your code
}
于 2014-10-15T07:09:53.543 回答
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
    }
}
于 2013-04-23T16:13:52.747 回答
0

我认为您将不得不自己实施。我不知道有什么开箱即用的活动可以满足您的需求。

您可能还想看看Monitored Undo Framework在这里
额外阅读。

于 2013-04-23T16:08:00.717 回答
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内容和之后的内容。

我试过了,效果很好!

于 2013-04-24T09:34:14.730 回答
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();
}
于 2019-04-26T14:00:26.327 回答