Foros del Web » Programación para mayores de 30 ;) » .NET »

Usando richTextBox del WPF

Estas en el tema de Usando richTextBox del WPF en el foro de .NET en Foros del Web. Hola: Estoy curioseando usando el WPF de Visual C# Express 2013. Algo tan simple como el componente richTextBox no encuentro donde poner el texto. En ...
  #1 (permalink)  
Antiguo 27/02/2015, 17:01
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 724
Antigüedad: 15 años, 6 meses
Puntos: 8
Usando richTextBox del WPF

Hola:

Estoy curioseando usando el WPF de Visual C# Express 2013. Algo tan simple como el componente richTextBox no encuentro donde poner el texto.

En el AWFse pone así:
richTextBox.Text = "Hola amigo";

¿Cómo se pone en WPF?

Saludos.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #2 (permalink)  
Antiguo 27/02/2015, 20:38
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 7 años, 10 meses
Puntos: 52
Respuesta: Usando richTextBox del WPF

Hola.

En primer lugar, en WPF no se "pone" nada, sino que se declara la UI en XAML y despues se usa DataBinding para popularla con datos.

Me refiero a que no se "pone" nada porque la UI no es un lugar para "poner" datos, si no para mostrarlos. Hay una diferencia conceptual muy importante aquí.

Con respecto a esto, te sugiero que leas los siguientes links:

XAML: https://msdn.microsoft.com/en-us/library/ms752059(v=vs.110).aspx
DataBinding: https://msdn.microsoft.com/en-us/library/ms752347(v=vs.110).aspx

Te menciono esto porque la mentalidad y la metodologia que se usan en WPF y en XAML en general (Windows Phone, Windows Runtime, Silverlight, Xamarin.Forms) es completamente diferente a la forma casera, primitiva, burda, poco profesional de poner todo junto en cualquier lado a la que se acostumbra en tecnologias primitivas e inferiores como Windows Forms o "swing" de java.

En WPF, la UI es la UI, y se declara en XAML, y los datos son datos, y se ponen totalmente aparte de la UI en lo que se llama un Model (modelo de negocio de tu aplicacion) o un ViewModel (modelo que representa el estado y las acciones de la UI de manera abstracta).

Con respecto a esto, te sugiero que busques y leas acerca del patrón MVVM, o Model-View-ViewModel, también conocido con su original nombre Presentation Model, termino acuñado nada menos que por Martin Fowler.

-----------------------------------------------------------------------------------------

Al grano con tu pregunta, el RichTextBox de WPF esta basado en el Document Model, una API de WPF que permite la creación de documentos enriquecidos y su posterior visualización en forma de documentos fidedignos (FixedDocument) o documentos fluidos (FlowDocument) que se adaptan a la pantalla y permiten ajustar su contenido según la situación.

WPF Document API: https://msdn.microsoft.com/en-us/library/ms748388(v=vs.110).aspx

Debido a esto, el RichTextBox no es un simple "control de texto", si no que es un componente que funciona como un editor de FlowDocument, por lo tanto no existe la propiedad "Text", si no que existe la propiedad Document que es de tipo System.Windows.Documents.FlowDocument (https://msdn.microsoft.com/en-us/library/system.windows.documents.flowdocument(v=vs.110).as px)

El FlowDocument se compone de Blocks, y los Blocks se componen de Inlines, por lo tanto un ejemplo de como agregar texto a un RichTextBox de WPF de desde code behind seria algo asi:

Código C#:
Ver original
  1. var doc = new System.Windows.Documents.FlowDocument();
  2.     doc.Blocks.Add(new Paragraph(new Run("Text")));
  3.     richTextBox.Document = doc;

Como verás, la API a simple vista parece mucho más compleja que la API de windows forms (y lo es), y por lo tanto muchisimo mas amplia y con mas capacidades.

Dicho esto, casi nadie usa code behind y codigo procedimental para manipular la UI en WPF. Esto se considera una mala practica. En XAML se pueden declarar el contenido de un FlowDocument de una forma muy parecida a HTML, y luego levantarlo en runtime usando la URI del archivo .xaml:

Código XAML:
Ver original
  1. <RichTextBox Document="./MyProject/MyDocument.xaml"/>

Te sugiero que investigues mas acerca de estos temas y que no trates bajo ningun punto de vista de encarar WPF con una mentalidad de windows forms, ya que ambos son totalmente incompatibles, winforms es practicamente inservible mientras que WPF es un framework amplio y muy potente.

Última edición por agleiva; 27/02/2015 a las 20:47
  #3 (permalink)  
Antiguo 27/02/2015, 21:23
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 724
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: Usando richTextBox del WPF

Buen argumento campeón.

He intentado usar:
Código:
RichTextBox_Mensajes.DataContext = "Hola";
Simplemente no funciona. Pruebo con el tuyo.
Código:
            var doc = new System.Windows.Documents.FlowDocument();
            doc.Blocks.Add(new Paragraph(new Run("Hola")));
            RichTextBox_Mensajes.Document = doc;
Y funciona de maravilla y a la primera.

Vaya con el cambio de tecnología se pega Microsoft y a veces se complica la vida. Antes se hacía con una sola línea y ahora se hace con tres. Si es así todo el rato, me incomoda bastante, se hace un programa enorme, quiezás me equivoque y solo en algunos casos y cosas.

Cada enlace que me diste esta en español-
https://msdn.microsoft.com/es-es/lib...or=-2147217396

Por supuesto, me meteré con una buena leída ya que esto es complejo más de lo que creía. Adaptación a los nuevos tiempos. Windows Forms parece que no se quiere ir, al menos a corto plazo para formar el WPF.

Por eso y poco más, no me funciona este código al recibir datos y meterlo en el RichTextBox.
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.IO.Ports; // No olvidar.
using System.Threading;

namespace WpfApplication1
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // Utilizaremos un string como buffer de recepción.
        string Recibidos;

        SerialPort serialPort1 = new SerialPort();

        public MainWindow()
        {
            InitializeComponent();

            serialPort1.BaudRate = 115200;
            serialPort1.PortName = "COM4";
            serialPort1.Parity = Parity.None;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.Two;

            // Abrir puerto mientras se ejecute la aplicación.
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

            }

            // Ejecutar la función REcepción por disparo del Evento ¡DataReived'.
            // serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
        }

        private void Recepcion(object sender, SerialDataReceivedEventHandler e)
        {
            // Acumular los caracteres recibidos a nuestro 'buffer' (string).
            Recibidos += serialPort1.ReadExisting();

            // Invocar o llamar al proceso de tramas.
            // this.Invoke(new EventHandler(Actualizar));
             
        }

        // Procesar los datos recibidos en el buffer y estraer tramas completas.
        private void Actualizar(object s, EventArgs e)
        {
            // Asignar el valor de la trama al RichTextBox.
            //RichTextBox_Mensajes.DataContext = Recibidos;

            var doc = new System.Windows.Documents.FlowDocument();
            doc.Blocks.Add(new Paragraph(new Run(Recibidos)));
            RichTextBox_Mensajes.Document = doc;
        }

        private void Button_Led_8_ON_Click(object sender, RoutedEventArgs e)
        {
            byte[] mBuffer = Encoding.ASCII.GetBytes("Led_8_ON");
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void Button_Led_8_OFF_Click(object sender, RoutedEventArgs e)
        {
            byte[] mBuffer = Encoding.ASCII.GetBytes("Led_8_OFF");
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

    }
}
Gracias por las explicaciones.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar

Última edición por REHome; 27/02/2015 a las 21:29
  #4 (permalink)  
Antiguo 27/02/2015, 21:45
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 7 años, 10 meses
Puntos: 52
Respuesta: Usando richTextBox del WPF

[QUOTE=REHome;4684424]He intentado usar:
Código:
RichTextBox_Mensajes.DataContext = "Hola";
No. Lo que estas haciendo es asignar el DataContext (que el es la instancia que utiliza el Binding Engine de WPF para resolver los Bindings en el "scope" al que estas haciendo referencia (en este caso el RichTextBox)). Esto no tiene ningun efecto a menos que tengas Bindings declarados en XAML.

En tu caso no solo no tenes ningun binding, si no que ni siquiera lo necesitas para hacer lo que estas haciendo. Si estas empecinado en usar un RichTextBox (cosa que creo que esta mal para lo que estas intentando hacer), deberias declarar en XAML algo así:


Código XAML:
Ver original
  1. <RichTextBox>
  2.         <FlowDocument>
  3.             <Paragraph x:Name="Paragraph"/>
  4.         </FlowDocument>
  5.     </RichTextBox>

Y luego usarlo de la siguiente forma:

Código C#:
Ver original
  1. this.Paragraph.Inlines.Add(new Run("Texto"));

Cita:
Iniciado por REHome Ver Mensaje
Vaya con el cambio de tecnología se pega Microsoft
Es cierto:

- Antes existia winforms que es una gran montaña de basura inservible, no soporta ningun tipo de personalizacion, no tiene estilos visuales, no utiliza aceleracion por GPU, no soporta multiples resoluciones, y no permite basicamente nada excepto lo que viene por defecto que es totalmente horrible y parece de la epoca de Windows 3.1, y encima para todo requiere una montaña horrible de "code behind" que es codigo basicamente inutil y especifico de la plataforma que no se puede reutilizar en ningun otro lado.

- Ahora hay un framework como WPF que no solo es muchisimo mas productivo, extensible, personalizable, soporta estilos y temas visuales, aprovecha la aceleracion del GPU, utiliza graficos vectoriales, tiene un motor de enlace a datos muy bueno, la posibilidad de implementar MVVM que te permite abstraer el codigo y reutilizarlo en otras plataformas, y encima sirve para hacer cosas como estas:

http://www.istartedsomething.com/20091124/razorfone-conceptual-windows7-wpf-multi-touch-retail/
http://www.identitymine.com/platforms/#wpf
http://www.ctech.com/

Realmente es un cambio bastante grande de parte de Microsoft.
-----------------------------------

Te escribi una respuesta a tu problema de SerialPort en el otro post, y ahi tambien te aclaro que estas usando RichTextBox para algo que no necesita un RichTextBox si no otra solucion diferente.
  #5 (permalink)  
Antiguo 27/02/2015, 22:08
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 724
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: Usando richTextBox del WPF

He estado mirando esos enlaces. Parece más poderoso de lo que creía. Lo que me fastidiaba que no incluía el puerto serie como componente al igual con el Windows Form. Windos Form lo conozco más y el WPF me llamó la atención precisamente que visualmente tiene mejores efectos y parece que chupa menos recusos que el W.Form de siempre.

No es de extrañar que Microsodt vuelva a sacar otra tecnología más innovadora que WPF en pocos años, así es la informática.

Por ahora, al menos la mayoría de la gente, veo que usa mucho el Windows Form y eso es lo que nos ha estado enseñando los profesores.

Saludos.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #6 (permalink)  
Antiguo 27/02/2015, 22:35
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 7 años, 10 meses
Puntos: 52
Respuesta: Usando richTextBox del WPF

Cita:
Iniciado por REHome Ver Mensaje
Lo que me fastidiaba que no incluía el puerto serie como componente al igual con el Windows Form.
Tenes un error conceptual fundamental:

WPF (al igual que winforms y muchos otros) es un Framework de Interfaz Grafica.

Como tal, NO DEBE "incluir el puerto serie", ya que las comunicaciones por puertos/networking/usb/acceso a disco/acceso a bases de datos/etc,etc,etc NO son responsabilidades de la GUI. La diferencia es que winforms es totalmente ridículo y mete cualquier cosa en cualquier lado y todo junto como una gran bola de basura.

WPF solo incluye cosas que son relativas a la GUI de una aplicación de Windows, y (muy poco) del manejo del ciclo de vida de una aplicacion (por ejemplo eventos de Startup y Shutdown de la clase Application). PARA NADA tiene que ver esto con cuestiones de serial ports y cualquier otra cosa random que se invente por ahi, WPF no mete todo junto en cualquier lado como una bolsa de gatos, sino que se encarga (y muy bien) de cumplir su funcion especifica que es permitirte hacer GUIs para Windows.

El resto del .Net Framework está disponible para lo que lo necesites, y WPF no te va a impedir para nada que hagas uso de cualquier clase o API o funcionalidad que esté dentro (o fuera) del .Net Framework, pero no esperes que WPF se aparezca con cualquier cosa como winforms como si estuvieramos en 1995 y el principio de Separación de Responsabilidades nunca hubiera existido.

En fin, WPF es un framework profesional, mientras que winforms es una bolsa de gatos, que solo sirve para que la gente que viene de usar Visual Basic 6 se pueda adaptar mejor a .Net.

Etiquetas: richtextbox, usando, visual, wpf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:42.