我需要能够检测是否触发了“撤消”,以及它是否对我的RichTextBox
.
我在此刻输入内容RichTextBox
,然后按Ctrl+Z,windows 似乎为我处理了撤消操作。我希望能够编写在此之后立即触发的代码。我一直在四处寻找,找不到任何东西。
提前致谢。
我需要能够检测是否触发了“撤消”,以及它是否对我的RichTextBox
.
我在此刻输入内容RichTextBox
,然后按Ctrl+Z,windows 似乎为我处理了撤消操作。我希望能够编写在此之后立即触发的代码。我一直在四处寻找,找不到任何东西。
提前致谢。
从 .Net 3.0 开始,有一种简单的内置方法可以在执行撤消命令(以及其他命令)时获得通知:
CommandManager.RegisterClassCommandBinding(typeof(MyClass),
new CommandBinding(ApplicationCommands.Undo, OnUndo));
只需在静态构造函数(或其他地方)中调用这行代码并添加一个静态方法:
private static void OnUndo(object sender, ExecutedRoutedEventArgs e)
{
//your code
}
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
}
}
我认为您将不得不自己实施。我不知道有什么开箱即用的活动可以满足您的需求。
您可能还想看看Monitored Undo Framework。在这里
额外阅读。
如果我很了解你,你想比较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
内容和之后的内容。
我试过了,效果很好!
如前所述,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();
}