Was ist der einfachste Weg, um ein Framework zu bauen, die fett und kursiv Markup-Text hat?

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

  •  21-09-2019
  •  | 
  •  

Frage

Gibt es eine elegantere Möglichkeit folgende zu tun?

Im Grunde brauche ich eine einfache Möglichkeit, programmatisch baut eine WrapPanel (oder andere Framework), dass:

  • Wraps richtig
  • können einige Worte haben fett Text
  • können einige Wörter haben kursiv Text
  • ermöglicht es anderen Formatierung , z.B. Farbe, Hintergrund
  • Ideal wäre eine Methode sein, dass Konvertiten z.B. „This is <b>bold</b> and this is <i>italic</i> text.“ in einen entsprechenden Framework so I kann z.B. fügen Sie ihn in einem Stackpanel und zeigt sie an.

Code:

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);
        }
    }
}
War es hilfreich?

Lösung

Edit: Ich entdecken in einer anderen Antwort, dass der TextBlock auch eine Inlines Sammlung hat, an dem ein Runs hinzufügen kann. Anvaka Antwort genial verwendet eine angefügte Eigenschaft als eine Art Konverter.


Was ich denke, Ihre Situation gerecht wird, ist ein FlowDocumentScrollViewer und ein FlowDocument. Ich beschreibe manuelle Erstellung eines durch eine IValueConverter ein wenig hier .

Sie werden wahrscheinlich ähnliche Hilfsfunktionen verwenden, wie Sie in Ihrem Beispiel gezeigt haben, aber die FlowDocument ist schon viel wie HTML und verarbeiten mühelos wickeln.

Sie fügen Paragraphs zum FlowDocument, Sie Runs zum Paragraph und jeder Run ergibt sich aus TextElement hinzufügen, so hat es eine Menge von den gleichen Eigenschaften, dass TextBlocks tun.

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 );

Auch wenn die Formatierung Teil gehen zu fett / kursiv-Tags beschränkt bleiben oder ein anderen extrem einfachen Markup, die Verwendung von Regex.Split() könnte der einfachste Weg, den einzelnen Runs von einem einzelnen String zu bestimmen. Es ermöglicht Ihnen, eine Zeichenfolge in mehrere Strings zu spalten, aber halten Sie Ihre „Trennzeichen“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top