2010-02-17 36 views
0

有沒有更好的方法來做到以下幾點?構建具有粗體和斜體標記文本的FrameworkElement的最簡單方法是什麼?

基本上,我需要一個簡單的方法來編程建立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); 
     } 
    } 
} 

回答

4

編輯:我在一個不同的答案,該TextBlock也有Inlines收集到一個可以添加Run小號發現。 Anvaka's answer巧妙地使用附加屬性作爲一種轉換器。


我覺得會適合你的情況是FlowDocumentScrollViewerFlowDocument。我描述了通過IValueConverter有點here手動創建一個。

您可能會使用與您在示例中顯示的類似的幫助函數,但FlowDocument已經非常像HTML,並且可以毫不費力地處理包裝。

你加Paragraph S到FlowDocument,添加Run S到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最簡便的方法串。它允許你將一個字符串分成多個字符串,但保留你的「分隔符」。

相關問題