ما هي أسهل طريقة لبناء إطار عمل يحتوي على نص ترميز جريء ومائل؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

هل هناك أي طريقة أكثر أناقة للقيام بما يلي؟

في الأساس أحتاج إلى طريقة سهلة ل برمجيا القيام بالبناء 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() قد تكون أسهل طريقة لتحديد المنفصل RunS من سلسلة واحدة. يتيح لك تقسيم سلسلة إلى سلاسل متعددة ولكن الحفاظ على "المحددات" الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top