Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 23 Diciembre 2015, 01:53 am



Título: Intentar hacer scroll bar
Publicado por: Meta en 23 Diciembre 2015, 01:53 am
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.

(https://social.msdn.microsoft.com/Forums/getfile/771689)

Código
  1.            // Asignar el valor de la trama al richTextBox.
  2.            richTextBox1.Text = Recibidos + "\n";
  3.  
  4.            // Selecciona la posición final para leer los mensajes entrantes.
  5.            richTextBox1.SelectionStart = richTextBox1.Text.Length;
  6.  
  7.            // Mantiene el scroll en la entrada de cada mensaje.
  8.            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.


Título: Re: Intentar hacer scroll bar
Publicado por: Eleкtro en 23 Diciembre 2015, 02:58 am
Primero las soluciones:

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

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

3. Para desplazarte hasta el final del documento, puedes utilizar el método ScrollToEnd:
Código
  1. 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.


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 23 Diciembre 2015, 05:31 am
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.

1sTaKKoGIqA

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.


Título: Re: Intentar hacer scroll bar
Publicado por: Eleкtro en 23 Diciembre 2015, 06:18 am
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.

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.


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 23 Diciembre 2015, 06:30 am
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.


Título: Re: Intentar hacer scroll bar
Publicado por: Eleкtro en 23 Diciembre 2015, 07:00 am
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.

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!


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 23 Diciembre 2015, 09:58 am
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í (http://es.slideshare.net/Metaconta2/apagar-y-encender-led-con-arduino-y-visual-studio-2015).

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
  1.            richTextBox.AppendText(Recibidos);
  2.  
  3.            var doc = new FlowDocument();
  4.            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
  5.            richTextBox.Document = doc;
  6.  
  7.            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.


Título: Re: Intentar hacer scroll bar
Publicado por: Eleкtro en 23 Diciembre 2015, 16:39 pm
No puedo desplazar nada porque no se muestra la barra del lateral o scroll.

Eso lo podrías resolver tu mismo...

  • RichTextBox.VerticalScrollBarVisibility Property (https://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.verticalscrollbarvisibility%28v=vs.95%29.aspx)
  • RichTextBox.HorizontalScrollBarVisibility Property (https://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.horizontalscrollbarvisibility%28v=vs.95%29.aspx)

Repasa los otros miembros de la class RichTextBox.

Saludos


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 24 Diciembre 2015, 05:28 am
Hola:

Lo he intentado así, pero no funciona.
Código
  1.           richTextBox.AppendText(Recibidos);
  2.  
  3.            richTextBox.VerticalScrollBarVisibility { get; set; }
  4.  
  5.            var doc = new FlowDocument();
  6.            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
  7.            richTextBox.Document = doc;
  8.  
  9.            richTextBox.ScrollToEnd();

Espero que no tenga que tocar nada en el XML.

Saludos.


Título: Re: Intentar hacer scroll bar
Publicado por: Eleкtro en 24 Diciembre 2015, 12:09 pm
Lo he intentado así, pero no funciona.
Código
  1. richTextBox.VerticalScrollBarVisibility { get; set; }

Solo tienes que asignarle el valor a la propiedad:
Código
  1. 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


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 25 Diciembre 2015, 13:26 pm
Hola:

Muchas gracias, ahora funciona de maravilla.

Código
  1.                       // Muestra el scroll vertical.
  2.            richTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  3.  
  4.            // Asignar el valor de la trama al richTextBox.
  5.            var doc = new FlowDocument();
  6.            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
  7.            richTextBox.Document = doc;
  8.  
  9.            // // Mantiene el scroll en la entrada de cada mensaje.
  10.            richTextBox.ScrollToEnd();

Felices fiestas campeón. ;)


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 28 Diciembre 2015, 00:18 am
Hola:

Cuando me entra los datos, me entras uno seguido del otro como muestra aquí.
(http://www.subeimagenes.com/img/retretyry-1581097.png)

Debe verse uno encima del otro como indica abajo.
(http://www.subeimagenes.com/img/retretyry-1581099.png)

Este es su código.
Código
  1.            // Muestra el scroll vertical.
  2.            richTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  3.  
  4.            // Asignar el valor de la trama al richTextBox.
  5.            var doc = new FlowDocument();
  6.            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
  7.            richTextBox.Document = doc;
  8.  
  9.            // // Mantiene el scroll en la entrada de cada mensaje.
  10.            richTextBox.ScrollToEnd();

He intentado hacer esto.
Código
  1. richTextBox.Document = doc + "\n";
Gravedad   Código   Descripción   Proyecto   Archivo   Línea
Error   CS0029   No se puede convertir implícitamente el tipo 'string' en 'System.Windows.Documents.FlowDocument'   Entrada_Arduino_WPF_2_CS   C:\Users\Usuario\Documents\Visual Studio 2015\Projects\Entrada_Arduino_WPF_2_CS\Entrada_Arduino_WPF_2_CS\MainWindow.xaml.cs   76

He intentado todo el rato con más cosas. Lo único que funciona, si en el dispositovo pongo el "\n". No me interesa, quiero hacerlo desde la interfaz WPF C#.

¿Alguna idea?

Falices fiestas 2015. ;)


Título: Re: Intentar hacer scroll bar
Publicado por: Eleкtro en 28 Diciembre 2015, 00:45 am
He intentado hacer esto.
Código
  1. richTextBox.Document = doc + "\n";

Ay! señor...

El salto de linea debes añadírselo al string:
Código
  1. doc.Blocks.Add(new Paragraph(new Run(Recibidos + "\n")));

...¡Si es que esto ya lo sabes!.

saludos!


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 28 Diciembre 2015, 01:36 am
Hola:

Ese ejemplo me voldi´de decir que también lo he hecho, compila pero no funciona, se comporta como si no estuviera el "\n".

Tiene que haber otra forma.

Tampoco funciona así, lo pongo por si acaso alguien cree que funcine y no.
Código
  1.            // Muestra el scroll vertical.
  2.            richTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  3.  
  4.            // Asignar el valor de la trama al richTextBox.
  5.            var doc = new FlowDocument();
  6.            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
  7.            doc.Blocks.Add(new Paragraph(new Run("\n")));
  8.            richTextBox.Document = doc;
  9.  
  10.            // // Mantiene el scroll en la entrada de cada mensaje.
  11.            richTextBox.ScrollToEnd();

Saludos.


Título: Re: Intentar hacer scroll bar
Publicado por: Eleкtro en 28 Diciembre 2015, 04:33 am
Código:
Environment.NewLine


Título: Re: Intentar hacer scroll bar
Publicado por: Meta en 28 Diciembre 2015, 05:37 am
Hola:

Así no funciona.
Código
  1.            // Muestra el scroll vertical.
  2.            richTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  3.  
  4.            // Asignar el valor de la trama al richTextBox.
  5.            var doc = new FlowDocument();
  6.            doc.Blocks.Add(new Paragraph(new Run(Recibidos + Environment.NewLine)));
  7.            richTextBox.Document = doc;
  8.  
  9.            // // Mantiene el scroll en la entrada de cada mensaje.
  10.            richTextBox.ScrollToEnd();

Ahora sí.
Código
  1.            // Muestra el scroll vertical.
  2.            richTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  3.  
  4.            // Asignar el valor de la trama al richTextBox.
  5.            var doc = new FlowDocument();
  6.            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
  7.            Recibidos += Environment.NewLine; // Una cadena que contiene "\r\n".
  8.            richTextBox.Document = doc;
  9.  
  10.            // // Mantiene el scroll en la entrada de cada mensaje.
  11.            richTextBox.ScrollToEnd();

Con menos código.
Código
  1.            // Muestra el scroll vertical.
  2.            richTextBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  3.  
  4.            // Asignar el valor de la trama al richTextBox.
  5.            var doc = new FlowDocument();
  6.            doc.Blocks.Add(new Paragraph(new Run(Recibidos += Environment.NewLine)));
  7.            richTextBox.Document = doc;
  8.  
  9.            // // Mantiene el scroll en la entrada de cada mensaje.
  10.            richTextBox.ScrollToEnd();

A pesar de que funciona. ¿Habrá otra forma mejor que esta?
Lo pregunto porque lo que hice puede ser chapuza.

https://msdn.microsoft.com/es-es/library/system.environment.newline%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

Gracias por todo.