太字と斜体のマークアップ テキストを含む FrameworkElement を構築する最も簡単な方法は何ですか?

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

  •  21-09-2019
  •  | 
  •  

質問

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

基本的に、簡単な方法が必要です プログラム的に を建てる WrapPanel (または他の FrameworkElement):

  • ラップする 正しく
  • いくつかの単語が持つことを許可します 大胆な 文章
  • いくつかの単語が持つことを許可します イタリック 文章
  • 他のものを許可します 書式設定, 、例えば色、背景
  • 理想的には、たとえば変換するメソッドです。」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);
        }
    }
}
役に立ちましたか?

解決

編集:別の回答で発見したのは、 TextBlock も持っています Inlines 追加できるコレクション Runs. アンヴァカの答え は、添付プロパティを一種のコンバータとして巧妙に使用しています。


あなたの状況に合うと思うのは、 FlowDocumentScrollViewer そして FlowDocument. 。手動による作成について説明します。 IValueConverter 若干 ここ.

例で示したものと同様のヘルパー関数を使用することになるでしょうが、 FlowDocument はすでに HTML によく似ており、ラップを簡単に処理できます。

あなたが追加します ParagraphFlowDocument, 、 あなたが追加します RunParagraph, 、そしてそれぞれ 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単一の文字列から。これを使用すると、文字列を複数の文字列に分割しながら、「区切り文字」を保持できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top