gpt4 book ai didi

c# - 命令模式 - 文本框问题中的撤消功能

转载 作者:太空宇宙 更新时间:2023-11-03 12:54:48 25 4
gpt4 key购买 nike

我有几个共享相同 TextChanged 监听器的 TextBox。

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 是使用带有 WPF 的 VS2015 设计器完成的。

最佳答案

我写过这样一个undo/do-again class long long ago && recognized exactly same error as you do.

恕我直言,这取决于以下内容:

  • 您更改文本框的文本
  • 文本框触发 exe命令: <------------------------------+
    • 您的列表获得一个新项目,命令项目 |
    • 命令项包含实际文本 |
  • 现在您点击 undo按钮: |
    • 您收到文本框的旧文本 |
    • 您将旧文本分配给文本框 |
    • 将旧文本分配给文本框文本明显改变 |
    • 文本框发送一个新的 exe 命令 ------------------------+
    • 现在列表中又出现了您正在查看的相同项目

这就是为什么你必须双击你的 undo在您认为文本发生变化之前按钮...

实际上文本已更改,但由于它保持不变,您不会通过任何UI 更新识别它。

你看到漂亮的 ASCII 箭头了吗? ^^

关于c# - 命令模式 - 文本框问题中的撤消功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34299878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com