¿Cuál es la manera más fácil de crear un FrameworkElement que ha negrita y cursiva de marcado de texto?
Pregunta
¿Hay alguna forma más elegante de hacer lo siguiente?
Básicamente necesito una manera fácil de a través de programación construir una WrapPanel
(o de otros FrameworkElement) que:
- envuelve correctamente
- permite que algunas palabras tienen un negrita texto
- permite que algunas palabras tienen un cursiva texto
- permite a otros formato, por ejemplo,el color, el fondo
- ideal sería algún método que convierte p. ej."
This is <b>bold</b> and this is <i>italic</i> text.
"en un adecuado FrameworkElement así que podrán, por ejemplo, agregar a un StackPanel y mostrarlo.
Código:
using System.Windows;
using System.Windows.Controls;
namespace TestAddTextBlock2343
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
WrapPanel wp = new WrapPanel();
wp.AddTextBlock("This is a sentence with ");
{
TextBlock tb = wp.AddTextBlockAndReturn("bold text");
tb.FontWeight = FontWeights.Bold;
}
wp.AddTextBlock(" and ");
{
TextBlock tb = wp.AddTextBlockAndReturn("italic text");
tb.FontStyle = FontStyles.Italic;
}
wp.AddTextBlock(" in it.");
}
}
public static class XamlHelpers
{
public static TextBlock AddTextBlockAndReturn(this WrapPanel wp, string text)
{
TextBlock tb = new TextBlock();
tb.Text = text;
wp.Children.Add(tb);
return tb;
}
public static void AddTextBlock(this WrapPanel wp, string text)
{
TextBlock tb = wp.AddTextBlockAndReturn(text);
}
}
}
Solución
Edit: he descubierto en una respuesta diferente que el TextBlock
también tiene una colección Inlines
a la que se puede añadir Run
s. respuesta de Anvaka ingeniosamente utiliza una propiedad que se adjunta como una especie de convertidor.
Lo que creo que se adapte a su situación es un FlowDocumentScrollViewer
y una FlowDocument
. Describo creación manual de uno a través de un IValueConverter
un poco aquí .
es probable que utilice funciones de ayuda similares a las que has demostrado en tu ejemplo, pero el FlowDocument
ya es muy similar a HTML y se encargará de envolver sin esfuerzo.
Se agrega a la Paragraph
s FlowDocument
, se agrega a la Run
s Paragraph
, y cada Run
deriva de TextElement
por lo que tiene muchas de las mismas propiedades que los hacen TextBlock
s.
FlowDocument doc = new FlowDocument();
Paragraph par = new Paragraph();
doc.Blocks.Add( par );
Run r;
r = new Run( "This is " );
par.Inlines.Add( r );
r = new Run( "bold" );
r.FontWeight = FontWeights.Bold;
par.Inlines.Add( r );
r = new Run( " and this is " );
par.Inlines.Add( r );
r = new Run( "italic" );
r.FontStyle = FontStyles.Italic;
par.Inlines.Add( r );
r = new Run( " text." );
par.Inlines.Add( r );
Además, si las subseries de formato se va a quedar restringida a las etiquetas de cursiva / negrita o algún otro marcado extremadamente simple, el uso de Regex.Split()
podría ser la forma más fácil de determinar los Run
s separadas de una sola cadena. Se le permite dividir una cadena en varias cadenas, pero mantiene sus "delimitadores".