【问题标题】:WPF RichTextBox PerformanceWPF RichTextBox 性能
【发布时间】:2009-01-16 05:48:31
【问题描述】:

当加载 50KB 的文本文档时,WPF 的 RichTextBox 控件的性能确实很慢。滚动延迟并按 Ctrl-A 选择所有文本需要 10 多秒。 (这在记事本上是即时的)。

我没有做任何花哨的位图效果。这是正常的吗?即使在空的 RichTextBox 上打字也似乎比平时有点迟钝。

有解决办法吗?备择方案?谢谢!

【问题讨论】:

  • 您是否在处理任何事件,例如 TextChanged?
  • 不,没有事件。现在,我只是从文件中加载文本。该应用没有任何其他功能。

标签: wpf performance controls


【解决方案1】:

您可能需要考虑使用不同的文本框控件。

Daniel Grunwald 完全从头开始为 SharpDevelop 编写了 Wpf 文本编辑器。它被称为 AvalonEdit,codeproject 上有一篇好文章:

http://www.codeproject.com/KB/edit/AvalonEdit.aspx

看来他对大文件做了优化。

【讨论】:

    【解决方案2】:

    我敢打赌Scintilla 的表现将优于大多数(如果不是全部)免费替代品。对于WPF,使用WPF 包装器。例如。 ScintillaNET.WPF(虽然没试过)。

    优点

    • 性能卓越。
    • 大量的语法高亮方案。

    缺点

    • 不要指望原生WPF 功能能够正常工作。例如。缩放、触摸...

    【讨论】:

    • 我在一个 WPF 应用程序中尝试了这个来显示大型 XML 文件,它真的很棒。加载和渲染 14 MB 的文件在 不到 1 秒 内完成(包括语法突出显示)。代码折叠和搜索的功能也很不错。好吧,弄清楚配置细节有点棘手,但这是投入时间的好方法。我使用了 Nuget 包:fernandreu.ScintillaNETfernandreu.ScintillaNET.WPF
    【解决方案3】:

    AvalonEdit 具有更好的性能并且适用于大输入字符串。这是一个最小的例子:

    MainWindow.xaml:

    <Window x:Class="TestProject.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:TestProject"
            xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
            mc:Ignorable="d"
            d:DataContext="{d:DesignInstance local:MainWindow}">
        <avalonedit:TextEditor Document="{Binding Document}" />
    </Window>
    

    MainWindow.xaml.cs:

    using ICSharpCode.AvalonEdit.Document;
    
    namespace TestProject
    {
        public partial class MainWindow
        {
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
                Document.Text = "My string";
            }
    
            public TextDocument Document { get; } = new TextDocument();
        }
    }
    

    【讨论】:

    • AvalonEdit 不错,但不适用于 RichText
    【解决方案4】:

    设置 TextBoxBase-property IsUndoEnabledProperty="False" 会稍微减少加载时间。

    如果您使用 Xceed.Wpf.Toolkit 中的 RichTextBox,您可以使用 BeginInit() 和 EndInit() 方法来初始加载文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多