Intentar hacer scroll bar

Iniciado por Meta, 23 Diciembre 2015, 01:53 AM

0 Miembros y 3 Visitantes están viendo este tema.

Meta

Hola:

El componente richTextBox en la aplicación WPF, al introducir datos, se crea el auto scroll, luego se va viendo lo lúltimo recibido abajo. El código es este.



Código (csharp) [Seleccionar]
           // Asignar el valor de la trama al richTextBox.
           richTextBox1.Text = Recibidos + "\n";

           // Selecciona la posición final para leer los mensajes entrantes.
           richTextBox1.SelectionStart = richTextBox1.Text.Length;

           // Mantiene el scroll en la entrada de cada mensaje.
           richTextBox1.ScrollToCaret();


El problema es usarlo con WPF, no hace ningún tipo de scrollbar.

¿Cuál es su equivalencia para WPF?

Un cordial saludos.

PD: Uso Visual Studio Community 2015.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#1
Primero las soluciones:

1. Tanto en WinForms cómo WPF puedes utilizar el método AppendText:
Código (vbnet) [Seleccionar]
rtb.AppendText("Hello World" & Environment.NewLine)

2. En WPF, para asignar el texto de un control RichTextBox debes crear un FlowDoc:
Código (vbnet) [Seleccionar]
FlowDocument doc = new FlowDocument();
doc.Blocks.Add(new Paragraph(new Run("Hello World" + Environment.NewLine)));

rtb.Document = doc;


3. Para desplazarte hasta el final del documento, puedes utilizar el método ScrollToEnd:
Código (vbnet) [Seleccionar]
rtb.ScrollToEnd();




Segundo, las recomendaciones, aunque intuyo que no me vas a hacer caso...

1. Para lo que quieres hacer, es un error utilizar un RichTextBox ya sea en WinForms o WPF, ya que como el nombre del control indica por si mismo su finalidad es mostrar texto con formato rich, pero si no lo utilizas con este fin entonces estarás sobrecargando la aplicación sin motivo coherente.

En su lugar debes utilizar un control TextBox, el cual además en WPF si que encontrarás la propiedad Text para mayor comodidad. (y también el método ScrollToEnd)
Nota: Asegúrate de modificar la propiedad TextBox.MaxLength para tus necesidades, ya sea en tecnología WinForms o WPF.

2. Los nombres de los controles (o mejor dicho, de los miembros marcados con visibilidad internal/Friend) los escribes en Camel-Case, pero se deben escribir en Pascal-Case; esto sería así:
NombreDeControl
o
RichTextBox1


Tal vez te parecerá una tontería, pero siguiendo correctamente las directrices de nomenclatura te acostumbrarías mucho mejor al lenguaje en cuestión, y aprovecharias el potencial para ser mejor programador, ya que reforzarías este aspecto que un programador debe tener presente.

Te dejo un link interesante sobre los beneficios generales de esto:
https://en.wikipedia.org/wiki/Naming_convention_%28programming%29

Saludos.








Meta

Hola:

Muchas gracias por la ayuda, voy a probar todo palmo a palmo.

En cuanto al usar TextBox,lo hacía antiguamente por el 2008 y prsenté este vídeo. Como verás, no había forma de quitar caracteres raros del principio y fin que muestra este vídeo como prueba.

[youtube=640,360]https://www.youtube.com/watch?v=1sTaKKoGIqA[/youtube]

Dscubrí richTextBox en su época ya por el 2010, ahora con el 2015 me hancontado otros programadores que use listBox, me parece como más incómodo y no se maneja igual que los dos anteriores.

Deja hacer pruebas y te comento, gracias de nuevo por los consejos.

Un cordial saludo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#3
Cita de: Meta en 23 Diciembre 2015, 05:31 AMEn cuanto al usar TextBox,lo hacía antiguamente por el 2008 y prsenté este vídeo. Como verás, no había forma de quitar caracteres raros del principio y fin que muestra este vídeo como prueba.

No se nada de electrónica, pero creo que lo que el video prueba es que estuviste tratando incorrectamente los datos recibidos.

Primero debes tratar los bytes al formar el string eligiendo la codificación correcta (eliminar todas las terminaciones nulas enviadas por el dispositivo), y luego mostrarlo en el TextBox o control deseado.

Si volvieses a hacer el experimento, simplemente mide la longitud del String construido ( String.Length() ) y verás que se cuentan más caracteres de los que realmente crees que tiene; el TextBox simplemente representó esos caracteres nulos que no eliminaste y que no se ven a simple vista.

Quizás esto te sirva:
https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.discardnull%28v=vs.110%29.aspx

Saludos.








Meta

Hola:

Eso pensé, esos carácteres que no se ven se son los comportamientos, los más usados son \n y \r, pero no los uso.

Aquí hay un ejemplo rápido.
http://www.codeproject.com/Articles/46603/A-PicRS-control-with-a-PIC-microcontroller-seri

Desde que sustituí a richTextBox, se acabaron los problemas, lo curioso que me dicen que use el santo ListBox, ese no me gusta mucho porque eliges línea a línea.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

Cita de: Meta en 23 Diciembre 2015, 06:30 AMDesde que sustituí a richTextBox, se acabaron los problemas, lo curioso que me dicen que use el santo ListBox, ese no me gusta mucho porque eliges línea a línea.

Hombre, el (Rich)TextBox (o EditControl) sirve para representar texto editable o no, y el ListBox para representar elementos de texto estáticos seleccionables para el usuario, como ves no tienen mucho que ver...

El ejemplo no puedo probarlo ya que no manejo esas cosas de electrónica, pero te curraste muchísimo la publicación, es de 10,
eso si, desde el 2008 y que todavía se te resistan estas cositas de los timers... eso baja la nota :P.

Saludos!








Meta

#6
Hola:

Me he pegado años sin usar RS232, se me ha olvidado muchísimo, ejjejeje. Ahora estoy de nuevo pero con Arduino. Dentro de poco subo las entradas de Arduino por puerto serie, el de encender y apagar un Led ya lo he publicado que puedes ver aquí.

Poco a poco a recordar.

Gracias por todo, cuando acabe el ejemplo completo, lo pongo aquí.

Edito
:


He hecho este código. A pesar que se incluye texto y el lo último, no se muestra la barra del scroll.

Código (csharp) [Seleccionar]
            richTextBox.AppendText(Recibidos);

            var doc = new FlowDocument();
            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
            richTextBox.Document = doc;

            richTextBox.ScrollToEnd();


No puedo desplazar nada porque no se muestra la barra del lateral o scroll.

¿Se te escapa algo o se me escapa a mi?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#7
Cita de: Meta en 23 Diciembre 2015, 09:58 AMNo puedo desplazar nada porque no se muestra la barra del lateral o scroll.

Eso lo podrías resolver tu mismo...


Repasa los otros miembros de la class RichTextBox.

Saludos








Meta

Hola:

Lo he intentado así, pero no funciona.
Código (csharp) [Seleccionar]
           richTextBox.AppendText(Recibidos);

            richTextBox.VerticalScrollBarVisibility { get; set; }

            var doc = new FlowDocument();
            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
            richTextBox.Document = doc;

            richTextBox.ScrollToEnd();


Espero que no tenga que tocar nada en el XML.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#9
Cita de: Meta en 24 Diciembre 2015, 05:28 AMLo he intentado así, pero no funciona.
Código (csharp) [Seleccionar]
richTextBox.VerticalScrollBarVisibility { get; set; }

Solo tienes que asignarle el valor a la propiedad:
Código (csharp) [Seleccionar]
richTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;

PD: Aparte, en el último código que has mostrado, o le asignas el FlowDoc o utilizas el método AppendText, pero no hagas las dos cosas al mismo tiempo (no tiene sentido hacerlo, ya que viene siendo lo mismo).

Saludos