我能以任何方式检测被调用的撤消命令吗?

时间:2015-01-30 14:38:12

标签: c# .net wpf xaml

我尝试向TextBox个实例添加附加事件。该事件将命名为UndoCommandInvoked,并且您猜测只要用户在修改后的TextBox上键入CTRL-Z就会引发该事件。

(现在我知道我可以处理关键事件并对按下CTRL-Z作出反应,但事情是我还想对被调用的Undo方法作出反应。)< / p>

在研究这个问题时,我开始理解(如果我弄错了,可以随意纠正我),默认情况下,TextBox个实例附加ApplicationCommands.UndoCommandBindings命令属性。

有没有办法可以成功安全地提取该命令并对其执行作出反应?

2 个答案:

答案 0 :(得分:-1)

您正确理解默认情况下撤消。

  

Textbox通过defualt

具有此功能

。 您的第二个选项是添加一个队列,并在每个文本或短语后输入该队列。你不需要撤消事件。 Ctrl + Z有一个ASCI代码。如果ASCI代码为**(你发现ASCI代码可能是Ctrl + Z),则在文本更改事件中放置一个if条件。如果这个**等于文本,虽然文本更改,您可以将旧文本出列。 我知道这是一个很难的解决方案,但如果它是如此渴望,那么它是你唯一的选择,到目前为止我认为

答案 1 :(得分:-1)

这是一种用最少的代码实现它的方法:(这是一个带有单个文本框的win表单背后的代码) 我有谷歌它,没有实现它。但似乎很有用

public partial class Form1 : Form
{
    Stack<Func<object>> undoStack = new Stack<Func<object>>(); 
    public Form1()
    {
        InitializeComponent();
    }
    private void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.U && Control.ModifierKeys == Keys.Control && undoStack.Count > 0)
            undoStack.Pop()();            
    }
    private void textBox_KeyPress(object sender, KeyPressEventArgs e)
    {            
        if (e.KeyChar != 'u' || Control.ModifierKeys != Keys.Control)
        {
            var textBox = (TextBox)sender;
            undoStack.Push(textBox.Text(textBox.Text));
        }
    }
}
public static class Extensions
{
    public static Func<TextBox> Text(this TextBox textBox, string text)
    {            
        return () => { textBox.Text = text; return textBox; };
    }
}