6

KeyPress イベントを使用して、プログラムでカスタム RichTextBox にテキストを追加しています。

SelectedText = e.KeyChar.ToString(); 

問題は、このような方法でテキストを挿入しても、CanUndo フラグがトリガーされないことです。

そのため、(テキスト ボックスの Undo() および Redo() メソッドを呼び出して) テキストを元に戻す/やり直しを試みても、何も起こりません。

TextChanged() イベント内からプログラムで KeyUp() イベントを呼び出そうとしましたが、それでも CanUndo に true のフラグが立てられませんでした。

元に戻す操作とやり直し操作のリストを作成せずに、挿入したテキストを元に戻すにはどうすればよいですか?

ありがとう

4

3 に答える 3

3

最終的に、スタックを使用して独自の取り消し/やり直しシステムを作成することにしました。

これが私がそれをした方法の簡単な概要です:

private const int InitialStackSize = 500;    
private Stack<String> undoStack = new Stack<String>(InitialStackSize);
private Stack<String> redoStack = new Stack<String>(InitialStackSize); 

private void YourKeyPressEventHandler(...)
{
        // The user pressed on CTRL - Z, execute an "Undo"
        if (e.KeyChar == 26)
        {
            // Save the cursor's position
            int selectionStartBackup = SelectionStart;

            redoStack.Push(Text);
            Text = undoStack.Pop();

            // Restore the cursor's position
            SelectionStart = selectionStartBackup;
        }
        // The user pressed on CTRL - Y, execute a "Redo"
        if (e.KeyChar == 25)
        {
            if (redoStack.Count <= 0)
                return;

            // Save the cursor's position
            int selectionStartBackup = SelectionStart + redoStack.ElementAt(redoStack.Count - 1).Length;

            undoStack.Push(Text);
            Text = redoStack.Pop();

            // Restore the cursor's position
            SelectionStart = selectionStartBackup;

            return;
        }    

        undoStack.Push(Text);
        SelectedText = e.KeyChar.ToString();  
}
于 2011-03-24T18:37:09.580 に答える
1

これは単なるアイデアですが、キャレットの位置をテキストを挿入する場所に設定し、Text プロパティを変更する代わりにキーを送信するとどうなるでしょうか?

SendKeys.Send("The keys I want to send");

癖があるに違いありませんが、私が言ったように、それは単なるアイデアです.

于 2011-03-24T15:57:17.547 に答える
0

TestBox.Pasteを使用できます。クラスの概要のドキュメントには、「元に戻すバッファーをクリアせずに、選択したテキストを指定したテキストに設定します。」とあり、混乱しているようです。試してみたところ、元に戻すが期待どおりに設定されます。

その名前にもかかわらず、クリップボードとはまったく関係がありません。現在選択されているテキストを引数として指定したテキストに置き換えるだけなので、質問が求めていることを非常に簡単な方法で実行しているようです。

于 2015-07-28T13:37:37.553 に答える