我在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中的行更远。我问过a separate question
答案 0 :(得分:1)
您可以使用不同类型的元素替换行,例如TextBlocks或Labels(可以控制换行)或“专为固定格式文档演示和打印场景设计”的字形。
我真的不认为你想尝试测量线条和强制文档宽度。
答案 1 :(得分:1)
我有类似的情况,但我确实想测量线宽。遗憾的是,RichTextBox有两个重要的功能 - 运行和格式化中的文本前景色和背景色。我需要颜色,可以不关心格式。我有一个“网格”字符,我想在角色上运行几个“游标”。我计划将背景颜色实现为单个游标,并使用前景颜色进行语法着色。它是一个固定宽度的字体,我不希望网格包装,所以基本上没有格式。我想我可以将它作为一个网格实现,我根据文本的大小在运行时设置行和列,但这似乎真的浪费资源 - 特别是如果文件非常大 - 即100x100网格每个细胞中都有一个单独的标签最初,也许有点天真,我认为它会与RichTextBox轻而易举,但我开始相信不然。另一种可能性是将画布放在标准TextBox的顶部并自己绘制rects,但是必须处理所有内容,因为滚动等等,听起来很丑陋而且容易出错。我现在的代码是:
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;
}
正如我在评论中所述,这似乎适用于我目前的案例,但我还没有真正与其他许多人一起测试过,所以我不确定它是否能够正常运行,而且它无论如何都只是一个很大的问题。我无法解释所以我想知道如何正确处理这个问题。感谢您的回复。哦,我应该指出,如上所述,for是固定音高,并且所有传入的字符串与合同强制执行的长度相同,因此所有行应该是完全相同的长度。