【问题标题】:RichTextBox Undo Adding SpacesRichTextBox 撤消添加空格
【发布时间】:2011-05-13 00:32:21
【问题描述】:

我为 RichTextBox 创建了自己的撤消系统,每当您执行某项操作时,都会将撤消操作添加到堆栈中,当您按下撤消时,此操作将被撤消。

这种行为与我实现它的所有控件都完美配合,除了 RichTextBoxes。我已将系统简化为最简单的元素,每当您按下删除时,它会将当前选定的文本及其索引添加到堆栈中,当您撤消此操作时,它将文本放回此索引。

这是去掉了最简单元素的代码(如文本文件的实际读取):

// Struct I use to store undo data
public struct UndoSection
{
    public string Undo;
    public int Index;

    public UndoSection(int index, string undo)
    {
        Index = index;
        Undo = undo;
    }
}

public partial class Form1 : Form
{
    // Stack for holding Undo Data
    Stack<UndoSection> UndoStack = new Stack<UndoSection>();

    // If delete is pressed, add a new UndoSection, if ctrl+z is pressed, peform undo.
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Modifiers == Keys.None && e.KeyCode == Keys.Delete)
            UndoStack.Push(new UndoSection(textBox1.SelectionStart, textBox1.SelectedText));
        else if (e.Control && e.KeyCode == Keys.Z)
        {
            e.Handled = true;
            UndoMenuItem_Click(textBox1, new EventArgs());
        }
    }

    // Perform undo by setting selected text at stored index.
    private void UndoMenuItem_Click(object sender, EventArgs e)
    {
        if (UndoStack.Count > 0)
        {
                    // Save last selection for user
            int LastStart = textBox1.SelectionStart;
            int LastLength = textBox1.SelectionLength;

            UndoSection Undo = UndoStack.Pop();

            textBox1.Select(Undo.Index, 0);
            textBox1.SelectedText = Undo.Undo;

            textBox1.Select(LastStart, LastLength);
        }
    }
}

但是,如果您只选择一行中的 \n,而下面的更多文本如下:,然后按删除,然后撤消,似乎会撤消此 \n 字符两次。

【问题讨论】:

  • 您是否已单步执行代码?可能是在某处输出堆栈中的所有内容,然后重新填充堆栈?

标签: c# winforms c#-4.0 richtextbox undo


【解决方案1】:

我想我已经解决了。当您像这样突出显示文本时: 您还会在我指出的最后一行的末尾包含 \n 字符。但是,当您按删除时,RTB 实际上并没有删除此字符。因此,当您撤消删除时,您必须删除任何尾随 \n 字符,因为它们实际上并没有被删除。

【讨论】:

    【解决方案2】:

    我已经设置了这段代码,它似乎可以使用文本框和富文本框为我做你希望它为我做的事情,我无法删除或添加额外的空格。是否有特定的操作顺序可以让我尝试重现您的问题?

    【讨论】:

    • 我终于找出了导致问题的原因,但不是解决方案:当您使用上一行中的 \n 字符开始选择时,删除选择,然后撤消该选择,\n 是不知何故添加了两次。
    猜你喜欢
    • 2010-09-21
    • 2011-03-19
    • 2011-08-26
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多