命令模式 - 文本框问题中的撤消功能
Command pattern - undo function in textbox issue
我有几个共享同一个 TextChanged
侦听器的文本框。
private void text1_TextChanged(object sender, TextChangedEventArgs e)
{
CommandManager.InvokeExecute(new SaveUpdateCommand((TextBox)sender));
}
当事件发生时,旧的 TextBox
对象被放入堆栈:
internal static class CommandManager
{
private static Stack<Command> commandStack = new Stack<Command>();
internal static void InvokeExecute(Command cmd)
{
cmd.Execute();
commandStack.Push(cmd);
}
internal static void InvokeUndo()
{
if (commandStack.Count > 0) commandStack.Pop().Undo();
}
}
然而,要使撤消生效,我需要单击 InvokeUndo 按钮两次,但我不明白为什么。除了必要的双击外,一切都很好。这是命令实现。
internal class SaveUpdateCommand : Command
{
private TextBox textBox;
private string oldText;
public SaveUpdateCommand(TextBox textBox)
{
this.textBox = textBox;
this.oldText = textBox.Text;
}
internal override void Execute()
{
//Not implemented within this command.
}
internal override void Undo()
{
textBox.Text = oldText;
}
}
感谢您的任何见解。 GUI 是使用 VS2015 设计器和 WPF 完成的。
我很久以前就写过这样的 undo/do-again
class && 发现 和你完全一样的错误。
恕我直言,这取决于以下内容:
- 您更改文本框的文本
- 文本框触发
exe
命令: <------------------------------+
- 您的列表获得一个新项目,命令项目为
|
- 命令项包含实际文本
|
- 现在您单击
undo
按钮:|
- 您收到文本框的旧文本
|
- 您将旧文本分配给文本框
|
- 将旧文本分配给文本框文本明显改变
|
- 文本框发送新的 exe 命令
------------------------+
- 现在列表中又出现了您正在查看的相同项目
这就是为什么在您认为文本发生变化之前必须双击 undo
按钮...
实际上文本已更改,但由于它保持不变,您不会被任何人识别UI更新.
看到漂亮的 ASCII 箭头了吗?? ^^
我有几个共享同一个 TextChanged
侦听器的文本框。
private void text1_TextChanged(object sender, TextChangedEventArgs e)
{
CommandManager.InvokeExecute(new SaveUpdateCommand((TextBox)sender));
}
当事件发生时,旧的 TextBox
对象被放入堆栈:
internal static class CommandManager
{
private static Stack<Command> commandStack = new Stack<Command>();
internal static void InvokeExecute(Command cmd)
{
cmd.Execute();
commandStack.Push(cmd);
}
internal static void InvokeUndo()
{
if (commandStack.Count > 0) commandStack.Pop().Undo();
}
}
然而,要使撤消生效,我需要单击 InvokeUndo 按钮两次,但我不明白为什么。除了必要的双击外,一切都很好。这是命令实现。
internal class SaveUpdateCommand : Command
{
private TextBox textBox;
private string oldText;
public SaveUpdateCommand(TextBox textBox)
{
this.textBox = textBox;
this.oldText = textBox.Text;
}
internal override void Execute()
{
//Not implemented within this command.
}
internal override void Undo()
{
textBox.Text = oldText;
}
}
感谢您的任何见解。 GUI 是使用 VS2015 设计器和 WPF 完成的。
我很久以前就写过这样的 undo/do-again
class && 发现 和你完全一样的错误。
恕我直言,这取决于以下内容:
- 您更改文本框的文本
- 文本框触发
exe
命令:<------------------------------+
- 您的列表获得一个新项目,命令项目为
|
- 命令项包含实际文本
|
- 您的列表获得一个新项目,命令项目为
- 现在您单击
undo
按钮:|
- 您收到文本框的旧文本
|
- 您将旧文本分配给文本框
|
- 将旧文本分配给文本框文本明显改变
|
- 文本框发送新的 exe 命令
------------------------+
- 现在列表中又出现了您正在查看的相同项目
- 您收到文本框的旧文本
这就是为什么在您认为文本发生变化之前必须双击 undo
按钮...
实际上文本已更改,但由于它保持不变,您不会被任何人识别UI更新.
看到漂亮的 ASCII 箭头了吗?? ^^