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"

水平滚动条:

Horizo​​ntalScrollBarVisibility="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滚动条自动滚动实例文本自动滚动实例

将 RTF 文本设置为 WPF RichTextBox 控件

禁用 RichTextBox 中的滚动(c#)

如何从 WPF RichTextBox 中选择文本然后替换并着色