繁体   English   中英

放置在 ViewBox 中时,大型 TextBlock 工作得更快

[英]Large TextBlock works much faster when placed inside a ViewBox

无意中发现了一个奇怪的行为。 包含 100k 行的大型 TextBlock 渲染速度非常慢,调整大小和滚动大约需要一秒钟。 但是,如果将此 TextBlock 放置在Stretch="None"的 ViewBox 中,它会非常快速地滚动和调整大小。

ViewBox 肯定改变了背景中的某些东西,但是什么以及为什么?

Window 内容

    <Grid>
        <ScrollViewer>
            <Viewbox Stretch="None">
                <TextBlock x:Name="TextContainer" HorizontalAlignment="Left" TextAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Center"/>
            </Viewbox>
        </ScrollViewer>
    </Grid>

代码隐藏,只是创建一些文本

public MainWindow()
{
    InitializeComponent();

    StringBuilder sb = new StringBuilder();
    for(int i = 1; i < 100000; i++)
    {
        sb.AppendLine($"Line #{i} ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    }
    this.TextContainer.Text = sb.ToString();
}

ScrollView 的存在没有任何影响,它在没有 ViewBox 的情况下仍然很慢,而在有它的情况下仍然很快。 如果我将 TextBlock 更改为具有相同内容的 TextBox,则在所有情况下性能都会变快。 所以它是特定于 TextBox 的。

小更新:澄清。 我不需要使用 TextBlock、TextBox 或 [insert whatever you want] 来显示大量文本。 我只想了解,为什么它会这样? 也许这些知识会帮助我找到解决以后问题的方法,避免一些麻烦,或者只是满足我对知识的渴望。 虽然我很欣赏关于性能优化的建议,但它并没有回答这个问题。

当你使用ViewBox时,布局和渲染只完成一次,然后,它只是一个被ScrollViewer裁剪的图像

如果没有ViewBox ,每次更改(滚动、调整大小、...)时都会重新计算布局。 这导致放缓。 也许可以禁用一些虚拟化,但我不确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM