2

我正在使用 C# 和 VS2008。

我有一个包含 FlowDocument 的 WPF 应用程序,其中包含一个段落,其中包含许多相当短的行(即 Spans 和 LineBreaks)。但是线的长度会有所不同。我希望 FlowDocument 的宽度足够大,以容纳最长的这些行而不换行,但不要更宽,以免浪费空间。

将其放入 Width=Auto 的网格列中不起作用:FlowDocument 总是消耗允许的最大宽度,因为 FlowDocument 可以有效地换行以适应许多不同的宽度。

当我在代码中生成它们时,我可以遍历这些行,并为每个行计算一个宽度,但我在 Span 或 Run 类上看不到 Width 属性。

关于如何自动或手动设置此文档的宽度的任何想法?


我使用了 AndrewS 的建议并从 FlowDocument 移动到 StackPanel 的标签,每个标签都包含一行。XAML 标记是

<Border BorderThickness="2" Margin="2" BorderBrush="Black">
    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
        <StackPanel 
         Orientation="Vertical"
            x:Name="itemsStackPanel" />
    </ScrollViewer>
</Border>

代码创建跨度并将它们添加如下:

        Label itemLabel = new Label();
        // pad left and right, keep close top and bottom
        itemLabel.Padding = new Thickness(2,0,2,0);
        itemLabel.Content = contentSpan;
        this.itemsStackPanel.Children.Add(itemLabel);

大小现在很完美,唯一的障碍是字体看起来与旁边的 FlowDocument 不完全相同,尽管字体系列和字体大小相同(Segoe UI,15pt),并且标签看起来很多比 FlowDocument 中的行更远。我已将此作为一个单独的问题提出

4

2 回答 2

1

您可以将这些行替换为不同类型的元素,例如 TextBlocks 或 Labels(您可以对其进行控制换行)或“专为固定格式的文档演示和打印场景而设计”的 Glyphs。

我真的不认为您想尝试测量线条并强制文档宽度。

于 2009-05-13T13:14:22.923 回答
1

我有类似的情况,但我确实想测量线宽。遗憾的是,RichTextBox 有两个重要的特性捆绑在一起——运行和格式化中的文本前景色和背景色。我需要颜色并且不太关心格式。我有一个字符“网格”,我想在字符上运行几个“光标”。我计划将背景颜色实现为单个光标,并使用前景色进行语法着色。这是一个固定宽度的字体,我不希望网格换行,所以基本上没有格式。我想我可以将其实现为一个网格,我可以在运行时根据我的文本有多大来设置行和列,但这似乎是一种真正的资源浪费——尤其是在文件非常大的情况下——即,一个 100x100 的网格,每个单元格中都有一个单独的标签。最初,也许有点天真,我认为使用 RichTextBox 会很容易,但我开始不相信。另一种可能性是将画布放在标准 TextBox 的顶部并自己绘制矩形,但必须处理所有东西,因为东西滚动等等。对我来说听起来很丑陋且容易出错。我现在的代码是:

    private static void SetRichText(RichTextBox rtb, string[] arLines)
    {
        Contract.Assert(arLines.All(l => l.Length == arLines[0].Length));
        FlowDocument doc = new FlowDocument { PageWidth = 65535.0 };

        IEnumerable<Paragraph> iep = arLines.Select(l =>
                                            {
                                                Paragraph p = new Paragraph();
                                                p.Inlines.Add(new Run(l));
                                                return p;
                                            });
        foreach (Paragraph p in iep)
        {
            doc.Blocks.Add(p);
        }

        rtb.Document = doc;
        doc.PagePadding = new Thickness(0, 0, 0, 0);

        Rect rcEOL = rtb.Document.ContentStart.GetPositionAtOffset(arLines[0].Length).GetCharacterRect(LogicalDirection.Forward);
        // TODO : Figure why I have to add a fudge factor in the following (I'm guessing some margin I'm unaware of in the 
        // RichTextBox somewhere)...
        rtb.Document.PageWidth = rcEOL.Right + 18;
    }

正如我在评论中所说,这似乎适用于我目前的情况,但我还没有真正与其他许多人一起测试过,所以我不确定它是否能正常工作,而且无论如何它只是一个大杂烩,我可以' t解释所以我想知道如何正确处理这个问题。感谢您的任何回复。哦,我应该指出,正如我上面所说的,for 是固定的音高,所有传入的字符串都与合同强制执行的长度相同,因此所有行的长度应该完全相同。

于 2010-01-03T09:46:48.420 回答