Was ist der einfachste Weg, um ein Framework zu bauen, die fett und kursiv Markup-Text hat?
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);
}
}
}
Lösung
Edit: Ich entdecken in einer anderen Antwort, dass der TextBlock
auch eine Inlines
Sammlung hat, an dem ein Run
s 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 Paragraph
s zum FlowDocument
, Sie Run
s zum Paragraph
und jeder Run
ergibt sich aus TextElement
hinzufügen, so hat es eine Menge von den gleichen Eigenschaften, dass TextBlock
s 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 Run
s von einem einzelnen String zu bestimmen. Es ermöglicht Ihnen, eine Zeichenfolge in mehrere Strings zu spalten, aber halten Sie Ihre „Trennzeichen“.