我需要能够检测是否已触发“撤消”,以及它是否对我RichTextBox
的内容产生了影响。
我在内容中将内容输入RichTextBox
,然后按 Ctrl + Z ,Windows似乎为我处理了撤消操作。我希望能够编写将在此之后直接触发的代码。我一直环顾四周,找不到任何东西。
提前致谢。
答案 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 Framework 并here进行额外阅读。
答案 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();
}