2015-08-13 78 views
0

我试图发送一个段落TextBlock的格式化的内容,但格式消失:如何将已格式化的段落插入到TextBlock中?

// Create a formatted paragraph 
Paragraph para = new Paragraph(); 
para.FontSize = 25; 
para.FontWeight = FontWeights.Bold; 
para.Inlines.Add(new Run("Text of paragraph.")); 

// Create a span with the content of the paragraph (FontSize 25 and FontWeight Bold stay alive) 
Span span = new Span(para.ContentStart, para.ContentEnd); 

// Create a TextBlock with the span (FontSize 25 and FontWeight Bold get lost) 
TextBlock textBlock = new TextBlock(); 
textBlock.Inlines.Add(span); 

可以做些什么来保持格式?提前致谢。

更新
段落的格式在运行时是已知的,所以我不能申请属性值一个手动之一。

更新2
这个问题的背景是,我想衡量格式化段落的长度,如果它们被延伸到一条线。 这可以通过TextBlock完成。段落位于TableCells中,我想自动调整列宽。

回答

0

我得出了以下解决方案:

// Create a formatted Paragraph 
Paragraph para = new Paragraph(); 
para.FontSize = 25; 
para.FontWeight = FontWeights.Bold; 
para.Inlines.Add(new Run("Text of paragraph.")); 

// Clone all Inlines 
List<Inline> clonedInlines = new List<Inline>(); 
foreach (Inline inline in para.Inlines) 
{ 
    Inline clonedInline = ElementClone<Inline>(inline); 
    clonedInlines.Add(clonedInline); 
} 

// Get all Paragraph properties with a set value 
List<DependencyProperty> depProps = DepPropsGet(para, PropertyFilterOptions.SetValues); 

// Apply the Paragraph values to each Inline 
foreach (DependencyProperty depProp in depProps) 
{ 
    object propValue = para.GetValue(depProp); 

    foreach (Inline clonedInline in clonedInlines) 
    { 
     // Can the Inline have the value? 
     if (depProp.OwnerType.IsAssignableFrom(typeof(Inline))) 
     { 
      // Apply the Paragraph value 
      clonedInline.SetValue(depProp, propValue); 
     } 
    } 
} 

// Create a TextBlock with the same properties as the Paragraph 
TextBlock textBlock = new TextBlock(); 
textBlock.Inlines.AddRange(clonedInlines); 

/// <summary> 
/// Cloner. 
/// </summary> 
public static T ElementClone<T>(T element) 
{ 
    // Element to Stream 
    MemoryStream memStream = new MemoryStream(); 
    XamlWriter.Save(element, memStream); 

    // Cloned element from Stream 
    object clonedElement = null; 
    if (memStream.CanRead) 
    { 
     memStream.Seek(0, SeekOrigin.Begin); 
     clonedElement = XamlReader.Load(memStream); 
     memStream.Close(); 
    } 
    return (T)clonedElement; 
} 

/// <summary> 
/// Property-Getter. 
/// </summary> 
public static List<DependencyProperty> DepPropsGet(DependencyObject depObj, PropertyFilterOptions filter) 
{ 
    List<DependencyProperty> result = new List<DependencyProperty>(); 

    foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(depObj, new Attribute[] { new PropertyFilterAttribute(filter) })) 
    { 
     DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(pd); 

     if (dpd != null) 
     { 
      result.Add(dpd.DependencyProperty); 
     } 
    } 

    return result; 
} 
0

格式化不能应用于TextBlock,它类似于Label,如果需要格式化,则可以使用<RichTextBox/>代替。你可以使它ReadOnly避免编辑。

例子:

<RichTextBox Margin="10" ReadOnly="true"> 
     <FlowDocument> 
      <Paragraph FontSize="36">Hello, world!</Paragraph> 
      <Paragraph FontStyle="Italic" TextAlignment="Left" FontSize="14" Foreground="Gray">Thanks to the RichTextBox control, this FlowDocument is completely editable!</Paragraph> 
     </FlowDocument> 
    </RichTextBox> 
1

相反的是,@联合国幸运的说,TextBlock中确实有这种格式的能力。

结账this article

通过将样式直接应用到跨度,您会在文本框中保留它。

摘录:

     TextBlock tb = new TextBlock(); 
        tb.TextWrapping = TextWrapping.Wrap; 
        tb.Margin = new Thickness(10); 
        tb.Inlines.Add("An example on "); 
        tb.Inlines.Add(new Run("the TextBlock control ") { FontWeight = FontWeights.Bold }); 
        tb.Inlines.Add("using "); 
        tb.Inlines.Add(new Run("inline ") { FontStyle = FontStyles.Italic }); 
        tb.Inlines.Add(new Run("text formatting ") { Foreground = Brushes.Blue }); 
        tb.Inlines.Add("from "); 
        tb.Inlines.Add(new Run("Code-Behind") { TextDecorations = TextDecorations.Underline }); 
        tb.Inlines.Add("."); 

更新 得到您的更新,但你可以采取的字体和样式从段落,然后将它们直接套用。至少从你上面的例子中看起来如此。

TextBlock tb = new TextBlock(); 

Paragraph para = new Paragraph(); 
para.FontSize = 25; 
para.FontWeight = FontWeights.Bold; 
para.Inlines.Add(new Run("new paragraph")); 

Span span = new Span(para.ContentStart, para.ContentEnd); 
span.FontWeight = para.FontWeight; 
span.FontSize = para.FontSize; 

tb.Inlines.Add(span); 

这是否适合您?

+0

我无法直接应用样式,请参阅上面的我的更新。 – Pollitzer

+0

看到我上面的更新 - 你可以从段落中的样式,仍然直接在代码中应用它们。 – nepdev

+0

段落的格式可以是任何东西,不一定总是指整个范围,所以,不幸的是,我不能这样做。请参阅我的更新2. – Pollitzer

0

相反的TextBlock的您可以使用RichTextBox,实现必要的格式 这里是一个示例代码

// Create a formatted paragraph 
     Paragraph para = new Paragraph(); 
     para.FontSize = 25; 
     para.FontWeight = FontWeights.Bold; 
     para.Inlines.Add(new Run("Text of paragraph.")); 

     Myrichtextboxtbx.Document.Blocks.Add(para); 

,然后添加你的RichTextBox为XAML

+0

请参阅我的更新2上面。 – Pollitzer