¿Cuál es la manera más fácil de crear un FrameworkElement que ha negrita y cursiva de marcado de texto?

StackOverflow https://stackoverflow.com/questions/2280924

  •  21-09-2019
  •  | 
  •  

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);
        }
    }
}
¿Fue útil?

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 Runs. 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 Paragraphs FlowDocument, se agrega a la Runs Paragraph, y cada Run deriva de TextElement por lo que tiene muchas de las mismas propiedades que los hacen TextBlocks.

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 Runs separadas de una sola cadena. Se le permite dividir una cadena en varias cadenas, pero mantiene sus "delimitadores".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top