如何将格式化的段落注入TextBlock?

时间:2015-08-13 08:50:27

标签: c# wpf formatting textblock paragraph

我尝试将段落的格式化内容传输到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中,我想自动调整列宽。

4 个答案:

答案 0 :(得分:1)

与@ un-lucky所说的相反,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);

这对你有用吗?

答案 1 :(得分: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>

答案 2 :(得分:0)

您可以使用RichTextBox代替TextBlock,并获得必要的格式 这是一个示例代码

// 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

答案 3 :(得分: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;
}