Pues eso… esto en realidad lo empecé a incluir en el post que estoy escribiendo sobre cómo implementar las opciones de abrir y guardar archivos usando un control RichTextBox para WPF, opero se iba a hacer demasiado largo, así que… he decidido publicarlo como post separado, ya que creo que puede servir para otra gente que no quieran saber nada sobre WPF ni RichTextBox 😉
Yo estoy usando Visual Studio 2017, pero creo que servirá con las versiones anteriores.
Lo que te voy a explicar es cómo crear un icono a partir de una imagen incluida como recurso en el proyecto, concretamente en una carpeta llamada Images. Como Visual Basic y C# no tienen exactamente las mismas opciones a la hora de añadir un nuevo icono ni a la hora de seleccionar el icono del proyecto, te pongo capturas diferenciadas para cada uno de esos lenguajes. El resto de acciones son comunes a los dos lenguajes.
Veamos paso a paso cómo crear un icono a partir de una imagen
Lo primero es seleccionar la imagen que queremos como un icono (figura1), con el botón secundario del ratón y elegimos la opción Abrir con… eso nos muestra otra ventana (figura 2) seleccionamos Paint y pulsamos en Aceptar.
Figura 1. Abrir la imagen a usar como iconoFigura 2. Abrir con Paint
La imagen se abre en Paint, allí indicamos Seleccionar todo y después le damos a copiar y ya tenemos la imagen en el portapapeles. ¡No la dejes escapar!
Volvemos a Visual Studio y agregamos al proyecto un nuevo archivo de tipo icono (figura 3): Menú contextual sobre el proyecto>Agregar>Nuevo elemento…
Figura 3. Añadir un nuevo archivo de tipo icono
Nota: En C# te mostrará una lista con todo lo que puedes añadir, entre los cuales se incluye Archivo de icono. En Visual Basic, te mostrará la lista de Elementos comunes, tendrás que selecciona la rama General y ahí estará el Archivo de icono.
Habrá un montón de tipos de imágenes con varias resoluciones, pero la que nos interesa es la de 16×16 de 24 bits, que no está, así que… tendrás que añadirla. Pulsa con el botón secundario del ratón sobre una de las imágenes que hay para que muestre el menú contextual y selecciona Nuevo tipo de imagen… y tendrás un cuando de diálogo como el mostrado en la figura 4.
Figura 4. Añadimos una imagen de 16×16 de 24 bits
Nota: Lo mismo piensas que la de 32 bits nos puede valer, ¡pero no! ya que en ese tipo de imágenes, Visual Studio no permite la edición.
En la barra de herramientas de edición de imágenes selecciona Herramienta Seleccionar rectángulo (figura 5) (para que se seleccione la imagen y poder pegar en ella) y dale a pegar y te quedará algo como lo mostrado en la imagen 6. El icono ese de 256 es uno de los que estaban ya al crear el icono.
Figura 5. Seleccionamos Herramienta Seleccionar rectánguloFigura 6. Aspecto al pegar la imagen copiada en la memoria en el icono
Todos los iconos que hay, salvo el de 16×16 de 24 bits, los tenemos que eliminar. Para ello, selecciona el icono a eliminar, pulsa con el botón secundario del ratón y del menú desplegable que te muestra, elige Eliminar tipo de imagen (figura 7). Eso lo tienes que hacer con todas las imágenes, salvo la que nos interesa.
Figura 7. Eliminar los tipos de imágenes que no nos interesan
Una vez que hemos quitado las imágenes que nos sobran, guárdalo.
El siguiente paso es abrir las propiedades del proyecto y seleccionar el icono que hemos guardado. En las propiedades de Aplicación selecciona el icono. En Visual Basic será Icono (figura 8) y en C# será donde indica Icono y manifiesto (figura 9). En ambos casos, el icono que acabamos guardado estará en la lista de iconos disponibles.
Figura 8. Seleccionar el icono en el proyecto de Visual BasicFigura 9. Seleccionar el icono en el proyecto de C#
¡Y ya está!
Espero que te sea de utilidad.
Nota: La imagen usada para el icono es una basada en una imagen PNG que se incluye con los recursos de Visual Studio 2017, concretamente RichTextBox_16x.png.
Pues eso… sigo con las cosillas que estoy aprendiendo a hacer al meterme con esto de programar RichTextBox en WPF (Xaml) y ahora le toca el turno a leer el contenido de un RichTextBox y devolverlo como cadena y a lo contrario: teniendo una cadena, asignarla a un RichTextBox, básicamente ese texto a asignar será en formato de texto enriquecido (Rtf).
El código que te voy a mostrar está adaptado de los que me he encontrado buscando en la web, adaptado porque están en C# y los he convertido a Visual Basic y porque les he añadido otras comprobaciones para que funcione como yo quiero
Devolver como cadena el texto de un RichTextBox (WPF)
Este código que lo he puesto en un método llamado getRtbText al que se pasa como argumento el control RichTextBox del que queremos extraer el contenido lo he adaptado de un ejemplo de la documentación en línea de Microsoft: Cómo: Extraer el contenido de texto de un control RichTextBox y básicamente lo que hace es definir un rango con el contenido completo del RichTextBox y devolverlo, muy simple, pero debes saber que existe una cosa llamada TextRange
Por eso existen los foros, blogs y demás, para que nos iluminen con esas cosas que desconocemos.
Aquí tienes el código para Visual Basic y C# tal como lo estoy usando en la aplicación de ejemplo para manipular y sincronizar el contenido de dos RichTextBox de WPF.
'''<summary>
''' Extrae el texto de un RichTextBox y lo devuelve como una cadena.
''' De un ejemplo en C# de:
''' https://docs.microsoft.com/es-es/dotnet/framework/wpf/controls/
''' how-to-extract-the-text-content-from-a-richtextbox
'''</summary>
PrivateFunction getRtbText(ByVal rtb As RichTextBox) AsString
Dim textRange = New TextRange(rtb.Document.ContentStart,
rtb.Document.ContentEnd)
Return textRange.Text
EndFunction
///<summary>
/// Extrae el texto de un RichTextBox y lo devuelve como una cadena.
/// De un ejemplo en C# de:
/// https://docs.microsoft.com/es-es/dotnet/framework/wpf/controls/
/// how-to-extract-the-text-content-from-a-richtextbox
///</summary>
privatestring getRtbText(RichTextBox rtb)
{
var textRange = new TextRange(rtb.Document.ContentStart,
rtb.Document.ContentEnd);
return textRange.Text;
}
Según la documentación, TextRange es una selección de contenido entre dos posiciones indicadas por TextPointers, y entre otras cosas, tiene una propiedad (Text) que devuelve el texto que hay entre esas dos posiciones.
Simple, ¿verdad? Pues eso… Pero yo no tenía ni idea de que existía TextRange.
Nota: El valor obtenido con esa función es el texto plano, es decir, sin formato, del contenido del control RichTextBox.
Sigamos…
Asignar el contenido de una cadena a un RichTextBox (WPF)
Y esta es la segunda cosa que te quiero explicar hoy. Teniendo una cadena de texto enriquecido (con código interno de RTF o de otros formatos) asignarla a un RichTextBox.
Hay un montón de formatos aceptados por el RichTextBox, los que están en la enumeración DataFormats, que son tanto de imágenes como de texto, pero aquí solo veremos tres:
Rtf el contenido a asignar debe estar en formato RTF.
Xaml el contenido a asignar debe estar en formato Xaml pero el que se puede poner en un RichTextBox o FlowDocument, en mis pruebas me ha admitido solo lo que está dentro de Section (ver el código de ejemplo). Es decir, no vale cualquier código Xaml.
Text Formato de texto plano, sin ningún tipo de formato.
La función que se encarga de asignar el contenido del RichTextBox se llama setRtbText que recibe como argumentos el control RichTextBox al que queremos asignar el texto, el texto a asignar y como último argumento el formato, que debe ser uno de los indicados en la enumeración DataFormats o el hard-code correspondiente, por ejemplo, para Rtf es Rich Text Format, para Xaml es Xaml y para Text es Text.
Te muestro el código de la función setRtbText y verás que el último parámetro es opcional y he puesto por defecto el valor de DataFormats.Rtf.
'''<summary>
''' Asigna el texto al RichTextBox
''' Adaptado de un código de C# de:
''' https://stackoverflow.com/questions/1367256/
''' set-rtf-text-into-wpf-richtextbox-control
'''</summary>
PrivateSub setRtbText(rtb As RichTextBox,
text AsString,
Optional formato AsString = "Rich Text Format")
' Antes usaba ASCII (08/Ene/19)
' ASCIIEncoding.Default.GetBytes(text)
Dim stream = New MemoryStream(Encoding.UTF8.GetBytes(text))
' Borrar el contenido del RichTextBox
' antes de añadir el nuevo contenido
' ya que me ha pasado que mezclaba el texto nuevo con
' el que ya tenía
rtb.Document.Blocks.Clear()
' Selection.Load(stream, DataFormats.Rtf)
rtb.Selection.Load(stream, formato)
EndSub
///<summary>
/// Asigna el texto al RichTextBox
/// Adaptado de un código de C# de:
/// https://stackoverflow.com/questions/1367256/
/// set-rtf-text-into-wpf-richtextbox-control
///</summary>
privatevoid setRtbText(RichTextBox rtb, string text,
string formato = "Rich Text Format")
{
// Antes usaba ASCII (08/Ene/19)
var stream = new MemoryStream(Encoding.UTF8.GetBytes(text));
// Borrar el contenido del RichTextBox
// antes de añadir el nuevo contenido
// ya que me ha pasado que mezclaba el texto nuevo con
// el que ya tenía
rtb.Document.Blocks.Clear();
rtb.Selection.Load(stream, formato);
}
Para llamar a este método podemos hacerlo indicando en el tercer argumento un valor de la enumeración DataFormats o la cadena correspondiente a su valor (hard-code string) y en este caso, como el tercer parámetro es opcional, si no lo indicamos usará el Rtf o la cadena correspondiente Rich Text Format.
Escucho voces… a ver, a ver… Valeee… que quieres un ejemplo completo de cómo usar todo esto… valeeee ¡a sus órdenes!
Un ejemplo práctico para usar todo lo explicado
Y con un par de extras, ya que para que te resulte más fácil probar los tres formatos indicados, incluyo código de ejemplo RTF y XAML (el de texto no tiene mucho misterio).
Ese código o texto de ejemplo está hard-code-ado (ya que estamos con el palabro ese), es decir, como en el código lo asigno como cadena, las cadenas que contengan deben tener dobles comillas dobles para que el editor usando (en mi caso el de Visual Studio) no lo interprete de forma no-texto.
El código Xaml con el diseño de la aplicación (ventana principal)
Este código vale tanto para Visual Basic como para C#, lo único que hay que indicar es el nombre del espacio de nombres (namespace) de la aplicación que hayas creado para probarlo.
El aspecto en tiempo de diseño de este código es el mostrado en la siguiente figura:
Figura 1. La ventana de la aplicación en tiempo de diseño.
Como puedes comprobar, tenemos un control RichTextBox en la parte inferior (con borde verde), un TextBox en la parte superior (con borde azul), tres botones (arriba del todo) para pegar texto de ejemplo en cada uno de los tres formatos creo que son los más comunes (para manejar textos) y en la parte de la derecha otros dos botones, uno para leer el contenido del texto y recuperarlo como una cadena normal (string) que se mostrará en el TextBox y otro botón con tres opciones del formato que vamos a asignar.
A destacar (sobre el código XAML del diseño) es el uso de Grid con columnas y filas para indicar dónde irá cada control y dos StackPanel para agrupar los botones y las opciones y etiquetas.
El StackPanel de los tres botones tienen la opción Orientation = Horizontal para que se coloquen horizontalmente (apilados de izquierda a derecha) y el otro con Orientation = Vertical para que se apilen de arriba a abajo.
El código completo tanto para Visual Basic como para C#.
En ese código están asignadas las cadenas de los tres ejemplos a usar según se pulse en uno de los tres botones de ejemplo.
Visual Basic:
'------------------------------------------------------------------------------' Leer y asignar texto a un RichTextBox (10/Ene/19)' Para el artículo:' El contenido de un RichTextBox de WPF, leer como cadena y asignar uno nuevo'' (c) Guillermo (elGuille) Som, 2019'------------------------------------------------------------------------------OptionStrictOnOptionInferOnImports System
Imports System.IO
Imports System.Text
ClassMainWindow'''<summary>''' Extrae el texto de un RichTextBox y lo devuelve como una cadena.''' De un ejemplo en C# de:''' https://docs.microsoft.com/es-es/dotnet/framework/wpf/controls/''' how-to-extract-the-text-content-from-a-richtextbox'''</summary>PrivateFunction getRtbText(ByVal rtb As RichTextBox) AsStringDim textRange = New TextRange(rtb.Document.ContentStart,
rtb.Document.ContentEnd)
Return textRange.Text
EndFunction'''<summary>''' Asigna el texto al RichTextBox''' Adaptado de un código de C# de:''' https://stackoverflow.com/questions/1367256/''' set-rtf-text-into-wpf-richtextbox-control'''</summary>PrivateSub setRtbText(rtb As RichTextBox,
text AsString,
Optional formato AsString = "Rich Text Format")
' Antes usaba ASCII (08/Ene/19)' ASCIIEncoding.Default.GetBytes(text)Dim stream = New MemoryStream(Encoding.UTF8.GetBytes(text))
' Borrar el contenido del RichTextBox' antes de añadir el nuevo contenido' ya que me ha pasado que mezclaba el texto nuevo con ' el que ya tenía
rtb.Document.Blocks.Clear()
' Selection.Load(stream, DataFormats.Rtf)
rtb.Selection.Load(stream, formato)
EndSubPrivateSub BtnLeer_Click(sender AsObject, e As RoutedEventArgs)
' Lee el contenido del RichTextBox y lo asigna a la caja de textoDim s = getRtbText(rtb)
txt.Text = s
EndSubPrivateSub BtnAsignar_Click(sender AsObject, e As RoutedEventArgs)
If optRtf.IsChecked Then
setRtbText(rtb, txt.Text, DataFormats.Rtf)
ElseIf optXaml.IsChecked Then
setRtbText(rtb, txt.Text, DataFormats.Xaml)
ElseIf optText.IsChecked Then
setRtbText(rtb, txt.Text, DataFormats.Text)
EndIfEndSubPrivateSub BtnRtf_Click(sender AsObject, e As RoutedEventArgs)
txt.Text =
{\colortbl ;\red255\green0\blue0;\red0\green176\blue80;}
\
Hola Mundo del texto enriquecido.\
Esto es un \b fichero\b0 RTF.\
}"
optRtf.IsChecked = TrueEndSubPrivateSub BtnXaml_Click(sender AsObject, e As RoutedEventArgs)
txt.Text =
"<Section xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
<Paragraph>
<Run>Paragraph 1</Run>
</Paragraph>
<Paragraph>
Before the LineBreak in Paragraph.
<LineBreak />
After the LineBreak in Paragraph.
<LineBreak/><LineBreak/>
After two LineBreaks in Paragraph.
</Paragraph>
<Paragraph>
<Span Background=""Red"" Foreground=""White""><Bold>Fondo rojo</Bold></Span>
<LineBreak/>
Texto normal, <Bold>en negrita</Bold>, <Italic>en itálica</Italic>
más texto normal... <Span Foreground=""Red""><Bold>¡Atención!</Bold></Span>
</Paragraph>
<Paragraph FontFamily=""Consolas""
FontSize=""24"" FontWeight=""Bold""
Foreground=""Green"">Párrafo con
<Span Foreground=""Blue"">varios</Span> atributos de
<Span Foreground=""FireBrick"">fuente</Span>.
</Paragraph>
<Paragraph FontSize=""28"" FontFamily=""Palatino Linotype""
Typography.NumeralStyle=""OldStyle""
Typography.Fraction=""Stacked""
Typography.Variants=""Inferior"">
Ahora va de números... <LineBreak/>
<Run>
0123456789 10 11 12 13
</Run>
<LineBreak/><LineBreak/>
<Run>
1/2 2/3 3/4
</Run>
</Paragraph>
</Section>
"
optXaml.IsChecked = TrueEndSubPrivateSub BtnText_Click(sender AsObject, e As RoutedEventArgs)
txt.Text =
"Érase una vez un texto normal, que está en el TextBox para pasarlo al
RichTextBox, (si pulsas en el botón de asignar."
optText.IsChecked = TrueEndSubEndClass
C#:
// ------------------------------------------------------------------------------// Leer y asignar texto a un RichTextBox (10/Ene/19)// Para el artículo:// El contenido de un RichTextBox de WPF, leer como cadena y asignar uno nuevo// // (c) Guillermo (elGuille) Som, 2019// ------------------------------------------------------------------------------using System;
using System.Collections.Generic;
using System.IO;
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;
namespace Wpf_Leer_y_asignar_contenido_de_RichTextBox_cs
{
///<summary>/// Lógica de interacción para MainWindow.xaml///</summary>publicpartialclassMainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
///<summary>/// Extrae el texto de un RichTextBox y lo devuelve como una cadena./// De un ejemplo en C# de:/// https://docs.microsoft.com/es-es/dotnet/framework/wpf/controls//// how-to-extract-the-text-content-from-a-richtextbox///</summary>privatestring getRtbText(RichTextBox rtb)
{
var textRange = new TextRange(rtb.Document.ContentStart,
rtb.Document.ContentEnd);
return textRange.Text;
}
///<summary>/// Asigna el texto al RichTextBox/// Adaptado de un código de C# de:/// https://stackoverflow.com/questions/1367256//// set-rtf-text-into-wpf-richtextbox-control///</summary>privatevoid setRtbText(RichTextBox rtb, string text,
string formato = "Rich Text Format")
{
// Antes usaba ASCII (08/Ene/19)var stream = new MemoryStream(Encoding.UTF8.GetBytes(text));
// Borrar el contenido del RichTextBox// antes de añadir el nuevo contenido// ya que me ha pasado que mezclaba el texto nuevo con // el que ya tenía
rtb.Document.Blocks.Clear();
rtb.Selection.Load(stream, formato);
}
privatevoid BtnLeer_Click(object sender, RoutedEventArgs e)
{
// Lee el contenido del RichTextBox y lo asigna a la caja de textovar s = getRtbText(rtb);
txt.Text = s;
}
privatevoid BtnAsignar_Click(object sender, RoutedEventArgs e)
{
if (optRtf.IsChecked == true)
setRtbText(rtb, txt.Text, DataFormats.Rtf);
elseif (optXaml.IsChecked == true)
setRtbText(rtb, txt.Text, DataFormats.Xaml);
elseif (optText.IsChecked == true)
setRtbText(rtb, txt.Text, DataFormats.Text);
}
privatevoid BtnRtf_Click(object sender, RoutedEventArgs e)
{
{\colortbl ;\red255\green0\blue0;\red0\green176\blue80;}
\
Hola Mundo del texto enriquecido.\
Esto es un \b fichero\b0 RTF.\
}";
optRtf.IsChecked = true;
}
privatevoid BtnXaml_Click(object sender, RoutedEventArgs e)
{
txt.Text = @"<Section xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
<Paragraph>
<Run>Paragraph 1</Run>
</Paragraph>
<Paragraph>
Before the LineBreak in Paragraph.
<LineBreak />
After the LineBreak in Paragraph.
<LineBreak/><LineBreak/>
After two LineBreaks in Paragraph.
</Paragraph>
<Paragraph>
<Span Background=""Red"" Foreground=""White""><Bold>Fondo rojo</Bold></Span>
<LineBreak/>
Texto normal, <Bold>en negrita</Bold>, <Italic>en itálica</Italic>
más texto normal... <Span Foreground=""Red""><Bold>¡Atención!</Bold></Span>
</Paragraph>
<Paragraph FontFamily=""Consolas""
FontSize=""24"" FontWeight=""Bold""
Foreground=""Green"">Párrafo con
<Span Foreground=""Blue"">varios</Span> atributos de
<Span Foreground=""FireBrick"">fuente</Span>.
</Paragraph>
<Paragraph FontSize=""28"" FontFamily=""Palatino Linotype""
Typography.NumeralStyle=""OldStyle""
Typography.Fraction=""Stacked""
Typography.Variants=""Inferior"">
Ahora va de números... <LineBreak/>
<Run>
0123456789 10 11 12 13
</Run>
<LineBreak/><LineBreak/>
<Run>
1/2 2/3 3/4
</Run>
</Paragraph>
</Section>
";
optXaml.IsChecked = true;
}
privatevoid BtnText_Click(object sender, RoutedEventArgs e)
{
txt.Text = @"Érase una vez un texto normal, que está en el TextBox para pasarlo al
RichTextBox, (si pulsas en el botón de asignar.";
optText.IsChecked = true;
}
}
}
El código de ejemplo para Xaml interno
A resaltar el texto a asignar para el formato XAML, para que veas que no es el código XAML de diseño de WPF, por ejemplo que te he mostrado antes, si no, el usado internamente por el control.
Ese ejemplo lo podrías poner dentro de la definición de FlowDocument y quedaría de esta forma:
<Section xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Paragraph>
<Run>Paragraph 1</Run>
</Paragraph>
<Paragraph>
Before the LineBreak in Paragraph.
<LineBreak />
After the LineBreak in Paragraph.
<LineBreak/>
<LineBreak/>
After two LineBreaks in Paragraph.
</Paragraph>
<Paragraph>
<Span Background="Red" Foreground="White">
<Bold>Fondo rojo</Bold>
</Span>
<LineBreak/>
Texto normal,
<Bold>en negrita</Bold> ,
<Italic>en itálica</Italic>
más texto normal...
<Span Foreground="Red">
<Bold>¡Atención!</Bold>
</Span>
</Paragraph>
<Paragraph FontFamily="Consolas" FontSize="24" FontWeight="Bold"
Foreground="Green">Párrafo con
<Span Foreground="Blue">varios</Span> atributos de
<Span Foreground="FireBrick">fuente</Span> .
</Paragraph>
<Paragraph FontSize="28" FontFamily="Palatino Linotype"
Typography.NumeralStyle="OldStyle"
Typography.Fraction="Stacked"
Typography.Variants="Inferior">
Ahora va de números...
<LineBreak/>
<Run>
0123456789 10 11 12 13
</Run>
<LineBreak/>
<LineBreak/>
<Run>
1/2 2/3 3/4
</Run>
</Paragraph>
</Section>
Fíjate en las asignaciones del párrafo último, para los números, que tiene definiciones tipográficas especiales. Ese ejemplo está sacado de la documentación en línea de Visual studio.
Aquí tienes una captura de la aplicación (usando el código de C#) en tiempo de ejecución mostrando el texto con el formato Xaml.
Figura 2. La aplicación en funcionamiento mostrando el código de ejemplo usado para el formato XAML.
Y esto es todo por hoy, que para mí ya es casi mañana… le falta poco más de 15 minutos para que acabe el día 10
Y para la próxima… cómo guardar y leer desde ficheros. Es decir, leer el contenido de un archivo y asignarlo al RichTextBox (usando los tres formatos usados aquí) y guardar el contenido de un RichTextBox en esos tres formatos, pero eso será… ma-ña-na…
Espero que te sea de utilidad… ya sabes que esa es la idea
Pues eso… que estoy preparando el artículo para usar dos RichTextBox de WPF sincronizados y esta es una de las cosas que allí (cuando lo publique) te explicaré. Hay muchas cosas que te tengo que explicar, así que… hoy empiezo por la más simple o que menos texto necesita
Esto es sencillo, pero… lo necesité para mostrar el número de palabras del documento activo (en el ejemplo de los RichTextBox sincronizados voy a usar 2 RichTextBox y un TextBox, los tres sincronizados -si así lo decides- ) y no lo investigué… preferí buscar una solución que alguien haya publicado ya… es que esto de las expresiones regulares, más que regulares son malas jajajajaja.
En serio, encontré un sitio web, en realidad un foro de Microsoft en el que alguien respondía con el código que te voy a mostrar, eso sí, el código original está en C# y para la aplicación base (ya sabes que empiezo escribiendo los ejemplos o mis aplicaciones con Visual Basic para .NET).
Una vez que se ve el código, uno dice… ¡pos qué fácil era! pero como todas estas cosas, hay que hacerlo primero
Este es el código de una función que recibe una cadena de texto y devuelve el número de palabras que hay.
La versión de Visual Basic .NET
'''<summary>
''' Contar las palabras de una cadena de texto
'''''' Adaptado usando una cadena en vez del Text del RichTextBox
''' (sería del RichTextBox para WinForms)
''' El código lo he adaptado de:
''' https://social.msdn.microsoft.com/Forums/en-US/
''' 81e438ed-9d35-47d7-a800-1fabab0f3d52/
''' c-how-to-add-a-word-counter-to-a-richtextbox
''' ?forum=csharplanguage
'''</summary>
PrivateFunction TextWordCount(texto AsString) AsInteger
Dim wordColl As MatchCollection = Regex.Matches(texto, "[\W]+")
Return wordColl.Count
EndFunction
La versión de C#:
///<summary>
/// Contar las palabras de una cadena de texto
////// Adaptado usando una cadena en vez del Text del RichTextBox
/// (sería del RichTextBox para WinForms)
/// El código lo he adaptado de:
/// https://social.msdn.microsoft.com/Forums/en-US/
/// 81e438ed-9d35-47d7-a800-1fabab0f3d52/
/// c-how-to-add-a-word-counter-to-a-richtextbox
/// ?forum=csharplanguage
///</summary>
privateint TextWordCount(string texto)
{
MatchCollection wordColl = Regex.Matches(texto, @"[\W]+");
return wordColl.Count;
}
Aquí tienes un ejemplo de uso en una aplicación de consola de .NET Core para Visual Basic y la salida del código.
Imports System
Imports System.Text.RegularExpressions
ModuleProgramSub Main(args AsString())
Dim s = "Hello World de las aplicaciones de consola en .net core!"
Console.WriteLine(s)
Dim w = TextWordCount(s)
Console.WriteLine($"la cadena anterior tiene {w} palabras")
Console.ReadKey()
EndSub'''<summary>''' Contar las palabras de una cadena de texto'''''' Adaptado usando una cadena en vez del Text del RichTextBox''' (sería del RichTextBox para WinForms)''' El código lo he adaptado de:''' https://social.msdn.microsoft.com/Forums/en-US/''' 81e438ed-9d35-47d7-a800-1fabab0f3d52/''' c-how-to-add-a-word-counter-to-a-richtextbox''' ?forum=csharplanguage'''</summary>PrivateFunction TextWordCount(texto AsString) AsIntegerDim wordColl As MatchCollection = Regex.Matches(texto, "[\W]+")
Return wordColl.Count
EndFunctionEndModule
Y esta es la salida por la consola de ese código.
Y esto es todo.
¡Mañana más!
Nos vemos. Guillermo
P.S. Ese código funciona también en .NET Core, la captura es de una aplicación de consola de .NET Core