WPF как посмотреть последнюю добавленную текстовую строку в TexBox - PullRequest
1 голос
/ 10 мая 2010

Я хотел бы симулировать вывод текста в консоли в моем приложении WPF но когда я добавляю новые строки в TextBox, я должен использовать полосу прокрутки, чтобы увидеть последний добавленный текст, но я хочу видеть последний добавленный текст, но для первых строк используйте полосу прокрутки

<TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto"
                   Text="{Binding Path=Data, Mode=TwoWay}" />`

Ответы [ 3 ]

1 голос
/ 10 мая 2010

Пожалуйста, рассмотрите возможность прокрутки текстового поля непосредственно из кода, например, (например, при изменении текста):

private void SampleTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
   if (SampleTextBox.LineCount != -1)
   {
      SampleTextBox.ScrollToLine(SampleTextBox.LineCount - 1);
   }
}

Пожалуйста, скажите мне, если это поможет.

1 голос
/ 10 мая 2010

Используйте метод ScrollToLine TextBox (и свойство LineCount, чтобы узнать, сколько строк) после добавления текста, чтобы убедиться, что только что добавленная строка видна.

0 голосов
/ 11 мая 2010

спасибо за ответы: я ожидал сделать это из XAML, но, как я понял, это возможно только из кода позади так что теперь моя имплементация с флажком для остановки функции ScrollToEnd:

public partial class MainWindow : Window
{
    private bool isScrollToEnd; 
    Timer timer; 

    public double WaitTime 
    {
        get { return waitTime / 1000; }
        set { waitTime = value * 1000; }
    }
    private double waitTime;

    public MainWindow()
    {
        InitializeComponent();
        isScrollToEnd = true;
        waitTime = 5000;
        tbWaitTime.DataContext = this;
        timer = new Timer(waitTime);
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    }

    // событие изменения текста в контроле tbConsole
    private void tbConsole_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (tbConsole.LineCount != -1 && isScrollToEnd)
        {
            tbConsole.ScrollToLine(tbConsole.LineCount - 1);
            cbIsScrolling.IsChecked = false;
        } 
    }

   private void cbIsScrolling_Click(object sender, RoutedEventArgs e)
    {
        if ((bool)cbIsScrolling.IsChecked)
        {
            isScrollToEnd = !(bool)cbIsScrolling.IsChecked;
            isScrollToEnd = false;
            timer.Interval = waitTime;
            timer.Start(); 
            return;
        }
        isScrollToEnd = true;
        timer.Stop();
        cbIsScrolling.IsChecked = false;
    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        timer.Stop();
        isScrollToEnd = true;
    }
}

и вот код XAML:

 <StackPanel  Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="2" Grid.RowSpan="2">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,3,10,2" VerticalAlignment="Top">
            <Label Content="Stop autoscrolling for:" />
            <TextBox Name="tbWaitTime" Text="{Binding Path=WaitTime}"
                     MinWidth="25" MaxWidth="50" Margin="5,0,0,0" />
            <Label Content="sec."/>
            <CheckBox Name="cbIsScrolling"  
                      HorizontalAlignment="Right" VerticalAlignment="Center"
                      Click="cbIsScrolling_Click" />
        </StackPanel>
        <TextBox Name="tbConsole" 
                     Background="LightGoldenrodYellow" Padding="5" Height="100"
                     VerticalScrollBarVisibility="Auto"
                     TextWrapping="Wrap" 
                     AcceptsReturn="True" 
                     Text="{Binding Path=Data, Mode=TwoWay}" TextChanged="tbConsole_TextChanged" />
    </StackPanel>
...