【发布时间】:2010-11-24 23:30:48
【问题描述】:
有谁知道如何禁用RichTextBox 的文本换行?
例如。如果我有一个不适合窗口的大字符串,RichTextBox 会放置无法显示的字符串部分的新行。我想禁用它(并仅通过使用Scrollbar 使其可见)。
非常感谢。
干杯
【问题讨论】:
标签: c# wpf richtextbox word-wrap
有谁知道如何禁用RichTextBox 的文本换行?
例如。如果我有一个不适合窗口的大字符串,RichTextBox 会放置无法显示的字符串部分的新行。我想禁用它(并仅通过使用Scrollbar 使其可见)。
非常感谢。
干杯
【问题讨论】:
标签: c# wpf richtextbox word-wrap
WPF 中的 RichTextBox 只是 FlowDocument 的编辑器。
根据MSDN:
文本总是包含在 RichTextBox 中。如果 你不想让文本换行然后设置 PageWidth 上的 FlowDocument 到 大于宽度 富文本框。但是,一旦页面 达到宽度,文本仍然换行。
因此,虽然您无法明确禁用 RichTextBox 的自动换行,但您可以执行以下操作:
richTextBox1.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
richTextBox1.Document.PageWidth = 1000;
在您有超过PageWidth 的行之前,这将具有基本相同的预期效果。
注意(截至 2015 年 7 月):VS2015 RC 允许 wordwrap = false 精确地按照 OP 的要求工作。我相信早期版本的 Visual Studio 也是如此。
【讨论】:
richTextBox1.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto
richTextBox1.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto 不起作用
如果您不想显示水平滚动条,请在 ScrollViewer 上强制设置 MinWidth:
<RichTextBox ScrollViewer.HorizontalScrollBarVisibility="Hidden">
<RichTextBox.Resources>
<Style TargetType="ScrollViewer">
<Setter Property="MinWidth" Value="2000" />
</Style>
</RichTextBox.Resources>
</RichTextBox>
【讨论】:
由于没有让我满意的答案,这是我的解决方案:
private void RichTxt_TextChanged(object sender, TextChangedEventArgs e)
{
string text = new TextRange(richTxt.Document.ContentStart, richTxt.Document.ContentEnd).Text;
FormattedText ft = new FormattedText(text, System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface(richTxt.FontFamily, richTxt.FontStyle, richTxt.FontWeight, richTxt.FontStretch), richTxt.FontSize, Brushes.Black);
richTxt.Document.PageWidth = ft.Width + 12;
richTxt.HorizontalScrollBarVisibility = (richTxt.Width < ft.Width + 12) ? ScrollBarVisibility.Visible : ScrollBarVisibility.Hidden;
}
问题是关于性能取决于文本长度和刷新频率。
【讨论】:
我还需要显示一个大字符串并尝试了 RichTextBox,但我不喜欢将 Document 的 PageWidth 设置为固定大小的解决方案。滚动条一直可见,滚动区域很大。
如果 TextBlock 足够了,您可以使用它并将其放置在 ScrollViewer 中。它非常适合我,因为我不需要 RichTextBox 的所有额外功能。
<ScrollViewer Width="200"
Height="100"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<TextBlock TextWrapping="NoWrap">
<TextBlock.Text>
Very long text Very long text Very long text
</TextBlock.Text>
</TextBlock>
</ScrollViewer>
【讨论】:
垂直滚动条:
VerticalScrollBarVisibility="Auto" MaxHeight="200"
水平滚动条:
HorizontalScrollBarVisibility="Auto" MaxWidth="400"
【讨论】:
适合我的解决方案。这个想法来自 here. 我在 XAML 中定义
<RichTextBox x:Name="PART_rtb" VerticalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Auto" TextChanged="MyRichTextBox_OnTextChanged">
<RichTextBox.Document>
<FlowDocument x:Name="PART_fd" >
<FlowDocument.Resources>
<!--This style is used to set the margins for all paragraphs in the FlowDocument to 0.-->
<Style TargetType="{x:Type Paragraph}">
<Setter Property="Margin" Value="3"/>
</Style>
</FlowDocument.Resources>
</FlowDocument>
</RichTextBox.Document>
</RichTextBox>
在代码中
private void MyRichTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
{
double i = PART_rtb.Document.GetFormattedText().WidthIncludingTrailingWhitespace + 20;
(sender as RichTextBox).Document.PageWidth = i;
}
【讨论】: