WPF RichTextBox第一行\ n未打印

时间:2017-11-03 05:18:26

标签: c# wpf

我有一个非常简单的WPF应用程序,它只有一个RichTextBox和一个声明如下的按钮:

<Window x:Class="TestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SimpleChessWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="670.8" Width="741.8">
  <Grid>
    <RichTextBox HorizontalAlignment="Left" Height="534" Margin="10,97,0,0" VerticalAlignment="Top" Width="715" Name="TestRtb">
      <RichTextBox.Resources>
        <Style TargetType="{x:Type Paragraph}">
          <Setter Property="Margin" Value="0"/>
        </Style>
      </RichTextBox.Resources>
    </RichTextBox>
    <Button Content="Button" HorizontalAlignment="Left" Margin="105,31,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
  </Grid>
</Window>

然后我尝试制作一个事件,在按下按钮时打印出一些测试文本:

  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e) {
      TestRtb.Document.Blocks.Clear();
      for(int i = 0; i < 64; ++i) {
        TestRtb.AppendText("i: " + i.ToString() + "\n");
        printBits(i);
        printBits(toBitSquare(i));
        TestRtb.AppendText("\n");
      }
    }

    private void printBits(int i) {
      string text = i.ToBitArrayString();
      TestRtb.AppendText(text + "\n");
    }

    public static int toBitSquare(int square) {
      return ((square & ~7) >> 1) | (square & 7);
    }
  }

'ToBitArrayString()'是我自己的int扩展名。它基本上用于打印其位数组表示。这就是我运行程序并按下按钮时发生的情况:

enter image description here

一切都按预期工作,但第一行“\ n”未打印。发生了什么事?

如果你想要复制,我的扩展功能如下:

private static string toBitArrayString(BitArray b, int spacePerByte = 1, int spacePerNibble = 0) {
  StringBuilder sb = new StringBuilder();
  for (int j = b.Length - 1; j >= 0; --j) {
    int i = b.Length - 1 - j;
    if (i % 4 == 0 && i > 0 && spacePerNibble > 0)
      sb.Append(string.Concat(Enumerable.Repeat(" ", spacePerNibble)));
    if (i % 8 == 0 && i > 0 && spacePerByte > 0)
      sb.Append(string.Concat(Enumerable.Repeat(" ", spacePerByte)));
    sb.Append(b[j] ? 1 : 0);
  }
  return sb.ToString();
}

public static string ToBitArrayString(this int input, int spacePerByte = 1, int spacePerNibble = 0) {
  BitArray b = new BitArray(new int[] { input });
  return toBitArrayString(b, spacePerByte, spacePerNibble);
}

1 个答案:

答案 0 :(得分:3)

.NET Framework 3.5 SP1附带的富文本框包含错误。 转换包含换行符(\ r)的纯文本时,不要混淆新段落(\ n)。 使用此工作: - TestRtb.AppendText(“i:”+ i.ToString()+“\ r”);