これに対する回避策を見つけました。純粋な 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 タイマーは魅力的に機能します。