1

私は、RichEditBox に基づくテキスト エディターに取り組んでいます。最終的に解決される「行に移動」機能を実装しました TextPointer.Paragraph.BringIntoView();

これに伴い、キャレットの位置も設定しました。私が見つけたのはBringIntoView、最初のものをクリックした場合にのみ機能することRichEditBoxです(フォーカスします)。それ以外の場合は無視されるようです。ただし、BringIntoView 周辺のコードによってキャレットの位置が調整されていることがわかります。

その問題の理由/性質を知っている人はいますか? どうすればそれを克服できますか?

4

2 に答える 2

1

これに対する回避策を見つけました。純粋な WPF 環境で機能するかどうかはわかりません。私の場合、必要に応じて WPF UserControls を使用して、主に Windows フォーム ソリューション内で WPF を実行しています。

BringIntoFocus() をすぐに呼び出す代わりに、タイマーによって処理されるキューに追加して、後で延期します。例えば:

System.Windows.Forms.Timer DeferredActionTimer = new System.Windows.Forms.Timer() { Interval = 200 };

Queue<Action> DeferredActions = new Queue<Action>();

void DeferredActionTimer_Tick(object sender, EventArgs e) {
  while(DeferredActions.Count > 0) {
    Action act = DeferredActions.Dequeue();
    act();
  }
}

フォーム コンストラクターまたは OnLoad イベントに以下を追加します。

DeferredActionTimer.Tick += new EventHandler(DeferredActionTimer_Tick);
DeferredActionTimer.Enabled = true;

最後に、TextPointer.Paragraph.BringIntoView();直接呼び出す代わりに、次のように呼び出します。

DeferredActions.Enqueue(() => TextPointer.Paragraph.BringIntoView());

Windows フォーム タイマーは、(メッセージ ポンプ ループを介して) メイン スレッドでイベントを開始することに注意してください。別のタイマーを使用する必要がある場合は、少し追加のコードが必要です。System.Timers.Timerではなくを使用することをお勧めしますSystem.Threading.Timer(もう少しスレッドセーフです)。Dispatcher.Invokeアクションを構造体でラップする必要もあります。私の場合、WinForms タイマーは魅力的に機能します。

于 2013-10-12T22:58:55.223 に答える
0

RichTextBox次に、またはを使用して、最初に(?)フォーカスを与えることはできませんKeyboard.Focus(richTextBox)richTextBox.Focus()

于 2009-10-26T08:45:58.647 に答える