2016-05-19 12 views
-1

私はLogというテキストボックスを持っていますが、問題は、テキストを追加したときに、ユーザーがスクロールの途中でスクロールした場合、新しいテキストが追加されたときにスクロールビューアーが先頭に戻ります。どのように私はユーザーの位置に修正できますか?ScrollViewerの位置を保持する方法は?

これは私のコントロールです:

<TextBox 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    Height="240" 
    IsReadOnly="True" 
    x:Name="txtLog" 
    HorizontalScrollBarVisibility="Disabled" 
    VerticalScrollBarVisibility="Auto" 
    ScrollViewer.CanContentScroll="True" 
    /> 

は、ここで私はテキストを追加方法は次のとおりです。あなたはそれをやっている

txtLog.AppendText(Environment.NewLine); 
txtLog.AppendText(text); 
+0

可能な重複http://stackoverflow.com/questions/18793548/how-to-prevent-textbox-auto-scrolls-when-append-text – Rowbear

+0

@Rowbearブロックのためにあまりにも多くのコードScrollViewerの – Dillinger

+0

返答を受け取る賞金は、スクロール位置を制御するコードが数行しかありません:) – Rowbear

答えて

1

TextBox.TextChanged Event

TextBox.VerticalOffset Property

私はあなたがあなたの目標を達成するためのTextBoxクラスの上記メンバーの両方を使用することができると思います。

https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.textboxbase.extentheight(v=vs.110).aspx (3つのリンクを投稿するには、 pff ... lol)

(上のリンク)ExtentHeightでは、最大スクロール位置も確認できます。

変更を加える前にScrollPositionを保存する必要があるのか​​、テキストの変更中にTextChangedイベントが呼び出されたのかはわかりません(EventHandler内のオブジェクトにTextオリジナルがあること、 )。

乾杯

+0

ところで、(SCROLLVIEWERの)TextInputイベントのOnTextInputハンドラをオーバーライドすると、さらに簡単になることがあります。しかし、自分でテストしなければならないでしょう、申し訳ありません。コントロールの変更を得るための他の可能なイベントはSourceUpdatedとTargetUpdatedですが、私はこのタスクのために、後者のイベントは過剰殺到だと思います。 – MDeero

0

方法は...厄介です。基本的に1つの巨大なテキストボックスで作業していますが、これはさまざまな理由で非効率的です。あなたの実装をListViewまたは文字列を追加するVirutulaizingStackPanelに変更します。これには、仮想化を使用する場合に、デフォルトで探している動作があり、メモリ効率が向上するという利点があります。

絶対に実行できない場合は、UIAtuomationProviderおよびUIAutomationTypesアセンブリでIScrollProviderインターフェイスと関連するクラスを使用して、テキストを追加するたびに手動でスクロール位置を設定できます。

関連する問題