FlowDocument 的行上有太多白色 space
FlowDocument has too much white space on lines
我的 WPF .NET5
应用中的 btnTest_Click(...)
事件成功地将 RichTextBox
的内容显示为 FlowDocumentReader
。但是,如下图所示,FlowDocumentReader
的不同页面查看模式会在行中产生过多的空白。 问题:为什么会这样,我在这里可能遗漏了什么,我们如何解决这个问题?
MainWindow.xaml
<Window x:Class="Wpf_RTBFlowDocTest.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:Wpf_RTBFlowDocTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<DockPanel Name="mainPanel">
<ToolBar Name="mainToolBar" Height="30" DockPanel.Dock="Top">
<Button x:Name="btnTest" Content="Test" Click="btnTest_Click"/>
</ToolBar>
<RichTextBox Name="rtbTest" AcceptsTab="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/>
<FlowDocumentReader x:Name="fdReader" ScrollViewer.VerticalScrollBarVisibility="Auto" IsScrollViewEnabled="True">
<FlowDocument IsOptimalParagraphEnabled="True" IsHyphenationEnabled="True" TextAlignment="Left"></FlowDocument>
</FlowDocumentReader>
</DockPanel>
</Grid>
</Window>
MainWindow.xaml.cs
private void btnTest_Click(object sender, RoutedEventArgs e)
{
var range = new TextRange(rtbTest.Document.ContentStart, rtbTest.Document.ContentEnd);
if (!range.IsEmpty)
{
if(fdReader.Document.Blocks.Count > 0)
fdReader.Document.Blocks.Clear();
using (var stream = new MemoryStream())
{
range.Save(stream, DataFormats.XamlPackage);
var copyto = new TextRange(fdReader.Document.ContentEnd, fdReader.Document.ContentEnd);
copyto.Load(stream, DataFormats.XamlPackage);
}
}
rtbTest.Visibility = Visibility.Collapsed;
fdReader.Visibility = Visibility.Visible;
}
单击 Test
按钮之前应用程序的原始显示:
上面代码后的单次浏览显示运行:
上面代码后的单滚动页面浏览显示运行:
以上代码后多次浏览显示运行:
完全符合预期:您的源文本文件包含大量 NewLine
个用于句子内换行的字符和用于行内容对齐的空格:
在流文档中,内容会自行调整以适合容器,但句子中的 NewLine
个字符会阻止 FlowDocument
控件正确设置文本格式。
因此,在将其加载到FlowDocument
控件之前,有必要对源文本进行一些处理。
我的 WPF .NET5
应用中的 btnTest_Click(...)
事件成功地将 RichTextBox
的内容显示为 FlowDocumentReader
。但是,如下图所示,FlowDocumentReader
的不同页面查看模式会在行中产生过多的空白。 问题:为什么会这样,我在这里可能遗漏了什么,我们如何解决这个问题?
MainWindow.xaml
<Window x:Class="Wpf_RTBFlowDocTest.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:Wpf_RTBFlowDocTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<DockPanel Name="mainPanel">
<ToolBar Name="mainToolBar" Height="30" DockPanel.Dock="Top">
<Button x:Name="btnTest" Content="Test" Click="btnTest_Click"/>
</ToolBar>
<RichTextBox Name="rtbTest" AcceptsTab="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/>
<FlowDocumentReader x:Name="fdReader" ScrollViewer.VerticalScrollBarVisibility="Auto" IsScrollViewEnabled="True">
<FlowDocument IsOptimalParagraphEnabled="True" IsHyphenationEnabled="True" TextAlignment="Left"></FlowDocument>
</FlowDocumentReader>
</DockPanel>
</Grid>
</Window>
MainWindow.xaml.cs
private void btnTest_Click(object sender, RoutedEventArgs e)
{
var range = new TextRange(rtbTest.Document.ContentStart, rtbTest.Document.ContentEnd);
if (!range.IsEmpty)
{
if(fdReader.Document.Blocks.Count > 0)
fdReader.Document.Blocks.Clear();
using (var stream = new MemoryStream())
{
range.Save(stream, DataFormats.XamlPackage);
var copyto = new TextRange(fdReader.Document.ContentEnd, fdReader.Document.ContentEnd);
copyto.Load(stream, DataFormats.XamlPackage);
}
}
rtbTest.Visibility = Visibility.Collapsed;
fdReader.Visibility = Visibility.Visible;
}
单击 Test
按钮之前应用程序的原始显示:
上面代码后的单次浏览显示运行:
上面代码后的单滚动页面浏览显示运行:
以上代码后多次浏览显示运行:
完全符合预期:您的源文本文件包含大量 NewLine
个用于句子内换行的字符和用于行内容对齐的空格:
在流文档中,内容会自行调整以适合容器,但句子中的 NewLine
个字符会阻止 FlowDocument
控件正确设置文本格式。
因此,在将其加载到FlowDocument
控件之前,有必要对源文本进行一些处理。