ما هي أسهل طريقة لبناء إطار عمل يحتوي على نص ترميز جريء ومائل؟
سؤال
هل هناك أي طريقة أكثر أناقة للقيام بما يلي؟
في الأساس أحتاج إلى طريقة سهلة ل برمجيا القيام بالبناء WrapPanel
(أو إطار عمل آخر):
- لفات بشكل صحيح
- يسمح ببعض الكلمات بالخط العريض نص
- يسمح ببعض الكلمات مائل نص
- يسمح للآخرين التنسيق, ، على سبيل المثال ، الخلفية
- المثالية ستكون بعض الطرق التي تحول على سبيل المثال "
This is <b>bold</b> and this is <i>italic</i> text.
"في إطار عمل مناسب حتى أتمكن من ذلك أضفه إلى Stackpanel وعرضه.
شفرة:
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);
}
}
}
المحلول
تحرير: اكتشفت في إجابة مختلفة TextBlock
لديه أيضا Inlines
مجموعة يمكن للمرء أن يضيف إليها Run
س. إجابة أنفاكا يستخدم ببراعة خاصية متصلة كنوع من المحول.
ما أعتقد أنه يناسب وضعك هو أ FlowDocumentScrollViewer
و FlowDocument
. أصف الخلق اليدوي لواحد من خلال IValueConverter
قليلا هنا.
من المحتمل أن تستخدم وظائف مساعد مماثلة كما أظهرت في مثالك ، ولكن FlowDocument
يشبه إلى حد كبير HTML وسوف يتعامل مع التفاف دون عناء.
تضيف Paragraph
ق إلى FlowDocument
, ، أنت تضيف Run
ق إلى Paragraph
, ، وكل Run
مستمد من TextElement
لذلك لديها الكثير من الخصائص نفسها TextBlock
ق.
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 );
وأيضًا ، إذا كانت سلسلة التنسيق ستبقى مقصورة على العلامات الجريئة/المائلة أو بعض العلامات البسيطة للغاية ، فاستخدم استخدامها Regex.Split()
قد تكون أسهل طريقة لتحديد المنفصل Run
S من سلسلة واحدة. يتيح لك تقسيم سلسلة إلى سلاسل متعددة ولكن الحفاظ على "المحددات" الخاصة بك.