C#/WPF:禁用 RichTextBox 的文本换行
Posted
技术标签:
【中文标题】C#/WPF:禁用 RichTextBox 的文本换行【英文标题】:C#/WPF: Disable Text-Wrap of RichTextBox 【发布时间】:2010-11-24 23:30:48 【问题描述】:有谁知道如何禁用RichTextBox
的文本换行?
例如。如果我有一个不适合窗口的大字符串,RichTextBox
会放置无法显示的字符串部分的新行。我想禁用它(并仅通过使用Scrollbar
使其可见)。
非常感谢。
干杯
【问题讨论】:
【参考方案1】: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 也是如此。
【讨论】:
我不喜欢这个解决方案,因为水平的 Scroolbar 一直可见...... 如果你可以在检测到(不知何故)需要换行时设置它会很好(例如检查每个“运行”[段落]宽度或其他东西)并在不需要时将其关闭(监控每次都检查文本更改,尽管它可能很慢) 可以设置richTextBox1.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto
richTextBox1.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto
不起作用【参考方案2】:
如果您不想显示水平滚动条,请在 ScrollViewer 上强制设置 MinWidth:
<RichTextBox ScrollViewer.HorizontalScrollBarVisibility="Hidden">
<RichTextBox.Resources>
<Style TargetType="ScrollViewer">
<Setter Property="MinWidth" Value="2000" />
</Style>
</RichTextBox.Resources>
</RichTextBox>
【讨论】:
【参考方案3】:由于没有让我满意的答案,这是我的解决方案:
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;
问题是关于性能取决于文本长度和刷新频率。
【讨论】:
【参考方案4】:我还需要显示一个大字符串并尝试了 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>
【讨论】:
TextBlock 不可编辑,而且我认为它不支持丰富的格式 @GeorgeBirbilis TextBlock 不可编辑,但它支持使用嵌套格式标记的丰富格式。粗体、超链接等【参考方案5】:垂直滚动条:
VerticalScrollBarVisibility="Auto" MaxHeight="200"
水平滚动条:
HorizontalScrollBarVisibility="Auto" MaxWidth="400"
【讨论】:
【参考方案6】:适合我的解决方案。这个想法来自 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;
【讨论】:
以上是关于C#/WPF:禁用 RichTextBox 的文本换行的主要内容,如果未能解决你的问题,请参考以下文章
WPF中RichTextBox的定位问题。如何使光标定位到与指定关键字所在的位置?
C#Winforms RichTextBox。如何按rtb的大小限制字符数?
WPF RichTextBox滚动条自动滚动实例文本自动滚动实例