1

我的应用程序中的以下btnTest_Click(...)事件WPF .NET5成功地将 a 的内容显示RichTextBoxFlowDocumentReader. 但是,如下图所示,不同的页面查看模式会FlowDocumentReader在行上产生过多的空白。问题:为什么会这样,我可能在这里遗漏了什么,我们如何解决这个问题?

主窗口.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>

主窗口.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单击按钮之前应用程序的原始显示

在此处输入图像描述

上述代码运行后的单一网页浏览显示

在此处输入图像描述

上述代码运行后的单滚动浏览量显示

在此处输入图像描述

上述代码运行后显示多个浏览量

在此处输入图像描述

4

1 回答 1

1

这完全符合预期:您的源文本文件NewLine在句子中包含大量换行字符,以及用于行内容对齐的空格:

在此处输入图像描述

在流文档中,内容会自行调整以适应容器,但NewLine句子中的字符会阻止FlowDocument控件正确格式化文本。

因此,在加载到FlowDocument控件之前,有必要对源文本进行一些处理。

于 2021-05-22T20:22:11.367 回答