2012-04-25 48 views
13

Tengo varias RichTextBox de solo lectura que se utilizan para registrar la salida. Como solo son de lectura, no parecen desplazarse automáticamente cuando se actualiza el texto. I puede utilizar el evento TextChanged para forzar un desplazamiento hacia el final, pero ¿no hay simplemente una manera de establecer una propiedad o algo en el XAML para que el desplazamiento ocurra de forma normal?¿Cómo puedo hacer un desplazamiento de RichTextBox hasta el final cuando agrego una nueva línea?

+0

posible duplicado de [RichTextBox de desplazamiento en la parte inferior verticall \ [WPF \]] (http://stackoverflow.com/questions/4256129/verticall-scroll-richtextbox-on-the-bottom-wpf) –

Respuesta

16

He buscado en Google su problema y he encontrado this mensaje. En la sección "Programación de RichTextBox", el autor describió cómo lograr que el comportamiento sea el esperado.

Por favor, revise y avíseme si es de alguna utilidad.


Me trataron de reproducir el problema y se le ocurrió la siguiente solución

<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> 

El código detrás de la misma es la siguiente:

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(); 
     } 
    } 
} 

Esto resuelve el problema de desplazamiento automático , por favor verifíquelo y avíseme si es de alguna ayuda.

+3

Hace visible la barra de desplazamiento, pero todavía no se desplaza al final del documento cuando el texto se agrega programáticamente. Parece que puedo estar atascado con el evento TextChanged. – Merad

+1

Espero que la solución editada pueda ayudarlo – Pank

+1

@Merad ¿Cómo lo hace con el evento TextChanged? –

13

He resuelto este problema usando un disparador Interactivity y una acción muy simple.

La acción se ve así:

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

Luego, en mi XAML tengo unas pocas cosas:

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

¡Gran solución! –

+0

No puedo hacer que esto funcione porque tiene algo que ver con que la versión de mezcla sea antigua. Y probé lo que se sugirió en http://stackoverflow.com/questions/32024034/the-type-from-assembly-is-built-with-an-older-version-of-blend-sdk-and-is -not-su sin suerte. ¿Alguna idea? – Snoopy

-1
RichTextBox.AppendText("String") 
RichTextBox.ScrollToCaret() 

Cuando estaba añadiendo a RichTextBox.text, ScrollToCaret() no funciona .

RichTextBox.text = RichTextBox.text + "String" 
RichTextBox.ScrollToCaret() 
+0

'ScrollToCaret' es para un WinForms' RichTextBox', no un WPF. Hay una pregunta al respecto aquí: [El cuadro de texto enriquecido se desplaza hacia abajo cuando se escriben nuevos datos] (http://stackoverflow.com/questions/9416608/rich-text-box-scroll-to-the-bottom- when-new-data-is-written-to-it) –

Cuestiones relacionadas