web-dev-qa-db-ja.com

新しい行を追加するときにRichTextBoxを最後までスクロールさせるにはどうすればよいですか?

ロギング出力に使用される読み取り専用のRichTextBoxがいくつかあります。読み取り専用であるため、テキストが更新されたときに自動的にスクロールするようには見えません。 I can TextChangedイベントを使用してスクロールを強制的に終了しますが、スクロールが通常のように行われるようにXAMLにプロパティなどを設定する方法はありませんか?

15
Merad

私はあなたの問題をグーグルで検索し、 this postを見つけました。 「RichTextBoxのプログラミング」のセクションで、作成者は、期待どおりの動作を実現することについて説明しました。

確認して、役に立ったかどうか教えてください。


私はあなたの問題を再現しようとしました、そして次の解決策を思いつきました

    <Window x:Class="CheckRichTextBox.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="170" Width="300">
    <StackPanel>
        <RichTextBox Height="100" Name="richTextBox1" IsReadOnly="True" VerticalScrollBarVisibility="Visible"/>
        <Button Name="btnAdd" Content="Click me to add text" VerticalAlignment="Bottom" Click="BtnAddClick" />
    </StackPanel>
</Window>

同じための背後にあるコードは次のとおりです。

using System.Windows;

namespace CheckRichTextBox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void BtnAddClick(object sender, RoutedEventArgs e)
        {
            richTextBox1.AppendText("You had Clicked the button for adding text\n");
            richTextBox1.ScrollToEnd();
        }
    }
}

これにより、自動スクロールの問題が解決します。確認して、役立つかどうかをお知らせください。

18
Pank

Interactivity トリガーと非常に単純なアクションを使用してこの問題を解決しました。

アクションは次のようになります。

public class ScrollToBottomAction : TriggerAction<RichTextBox>
{
    protected override void Invoke(object parameter)
    {
        AssociatedObject.ScrollToEnd();
    }
}

次に、XAMLに次のように表示されます。

<RichTextBox IsReadOnly="True" VerticalScrollBarVisibility="Auto">
     <i:Interaction.Triggers>
            <i:EventTrigger EventName="TextChanged">
                <interactivity:ScrollToBottomAction/>
            </i:EventTrigger>
     </i:Interaction.Triggers>
</RichTextBox>
14
Samuel Jack