【问题标题】:Slow loading on RichTextBlock by long String长字符串在 RichTextBlock 上加载缓慢
【发布时间】:2016-12-28 14:48:03
【问题描述】:

我的UWP 项目中有一个RichTextBlock,当我将长字符串设置为内容时,显示内容需要很长时间,例如 3 秒。我在网上搜索,发现因为它没有virtualization,它要渲染所有内容。 WPF和RichTextBox似乎存在问题。

你能建议我应该怎么做才能只呈现视觉内容吗?

【问题讨论】:

  • 你的字符串有多长?我用 12000 个字符串进行了测试,它在按下按钮时立即呈现。
  • 使用 Visual Studio Profiler 检查是什么花费了这么多时间。3 秒太长了。还要检查在发布模式下运行而不是调试是否有任何区别。

标签: wpf uwp richtextbox windows-10-universal


【解决方案1】:

我会按段落分割内容,并在 ListView 中分别呈现它们。

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate>
            <RichTextBlock />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

【讨论】:

  • 我有一个长段而不是多个
  • @Maryam 也许你不应该有一个很长的段落。
  • 我正在测试,我添加了 36,000 多个字符,但它仍然立即呈现......在 42000 字符串它给出了异常......所以还有其他东西减慢了代码
  • @HassaanAkbar ,您的 RTB 的高度可能是静态的,并且没有您的内容那么大,您明白我的意思吗?如果您将 RTB 的高度设置为内容,它会变慢
  • @HassaanAkbar,我有 60000 个字符
【解决方案2】:

把你的长字符串变成小字符串列表List&lt;string&gt; strList。每当 ScollViewer 到达末尾时,就会加载更多文本(在同一段落中)。

    <ScrollViewer Name="Scroll"
          ViewChanged="Scroll_OnViewChanged">
        <StackPanel>
            <RichTextBlock>
                <Paragraph x:Name ="P"></Paragraph>
            </RichTextBlock>
        </StackPanel>
    </ScrollViewer>

.

    private void Scroll_OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
            {
                var scroller = (ScrollViewer) sender;

                if (scroller.ScrollableHeight-scroller.VerticalOffset > 5) return;    
                if (pointer >= strList.Count) return;

                var run = new Run {Text = strList[pointer++]};

                P.Inlines.Add(run);
            }

pointer 只是 int 类型的私有类字段。

【讨论】:

  • 因为我有搜索页面,也许我想去页尾,这又慢了。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 2014-10-16
  • 2021-11-14
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多