我尝试向TextBox
个实例添加附加事件。该事件将命名为UndoCommandInvoked
,并且您猜测只要用户在修改后的TextBox
上键入CTRL-Z就会引发该事件。
(现在我知道我可以处理关键事件并对按下CTRL-Z作出反应,但事情是我还想对被调用的Undo
方法作出反应。)< / p>
在研究这个问题时,我开始理解(如果我弄错了,可以随意纠正我),默认情况下,TextBox
个实例附加ApplicationCommands.Undo
个CommandBindings
命令属性。
有没有办法可以成功安全地提取该命令并对其执行作出反应?
答案 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; };
}
}