【问题标题】:C#/WPF: Disable Text-Wrap of RichTextBoxC#/WPF:禁用 RichTextBox 的文本换行
【发布时间】:2010-11-24 23:30:48
【问题描述】:

有谁知道如何禁用RichTextBox 的文本换行? 例如。如果我有一个不适合窗口的大字符串,RichTextBox 会放置无法显示的字符串部分的新行。我想禁用它(并仅通过使用Scrollbar 使其可见)。

非常感谢。

干杯

【问题讨论】:

    标签: c# wpf richtextbox word-wrap


    【解决方案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;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-19
            • 2013-11-04
            • 1970-01-01
            相关资源
            最近更新 更多