0

次のことを行うためのよりエレガントな方法はありますか?

基本的に、次のような(または他のFrameworkElement)をプログラムで構築する簡単な方法が必要です。WrapPanel

  • 正しくラップする
  • 一部の単語に太字のテキストを含めることができます
  • 一部の単語に斜体のテキストを含めることができます
  • 色、背景などの他のフォーマットを許可します
  • 理想的なのは、たとえば「This is <b>bold</b> and this is <i>italic</i> text.」を適切なFrameworkElementに変換して、たとえば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);
        }
    }
}
4

1 に答える 1

4

編集:別の回答で、にsを追加できるコレクションTextBlockもあることを発見しました。Anvakaの答えは、アタッチされたプロパティを一種のコンバーターとして巧みに使用しています。InlinesRun


私があなたの状況に合うと思うのはとFlowDocumentScrollViewerですFlowDocument。ここでは、手動で作成する方法についてIValueConverter少し説明します

例で示したのと同様のヘルパー関数を使用する可能性がありますが、これFlowDocumentはすでにHTMLによく似ており、ラッピングを簡単に処理できます。

Paragraphにsを追加し、にsをFlowDocument追加すると、それぞれがから派生するため、sと同じプロパティが多数あります。RunParagraphRunTextElementTextBlock

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これにより、文字列を複数の文字列に分割できますが、「区切り文字」は保持されます。

于 2010-02-17T21:11:52.883 に答える