包装和大量数据的TextBox性能不佳

时间:2012-06-15 09:38:31

标签: c# wpf textbox

使用.NET 3.5,WPF中的文本框存在持久性问题。在启用了包装的TextBox中有大量(5000+行)数据量的情况下,窗口在调整大小时性能可笑。

会发生TextWrapping =“Wrap”。将文本数据绑定或仅以编程方式设置它没有任何区别。

代码实际上就像这样简单:

<TextBox Margin="12,39,337,29" Text="{Binding Output, Mode=OneWay}" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled" />

文本绑定到单个字符串。绑定数据未被更改。

编辑:在调整窗口大小时,数据没有被更改,这就是我的意思。它将在未来更新。 TextBox不需要是可编辑的,但实际文本确实需要是可选择的。的 /编辑。

我和AvalonEdit有一个快速的玩法,它有同样的问题。我找不到描述这个问题的任何其他线程,这似乎很奇怪。

有什么建议吗?

谢谢, 富

4 个答案:

答案 0 :(得分:2)

您可以对windowResizeStart事件做出反应并禁用文本块的换行。 然后在调整大小完成时将只包装一次。

你获得了表现但我失去了一些视觉天赋。

答案 1 :(得分:1)

慢的部分是一次显示所有文本。我之前遇到过这个问题,我控制中的TextBox变得非常大,并且整个控件都有一个ScrollViewer来处理非常大的TextBox。

你差不多要做了,但没有为你的身高/宽度设置最大值,我不确定你的ScrollViewer是否真的会被利用。

我的解决方案是在TextBox中使用内置的scrollViewer(你正在做),然后限制文本框高度/宽度的大小,这样它就不会尝试渲染100%的文本全部一次(实际上利用TextBox中的ScrollViewer)

(仅供参考,我也喜欢使用CanContentScroll = true,但我不认为它会影响速度)

<TextBox Margin="12,39,337,29" TextWrapping="Wrap" 
         Text="{Binding Output, Mode=OneWay}"
         ScrollViewer.CanContentScroll="true"
         VerticalScrollBarVisibility="auto" 
         HorizontalScrollBarVisibility="auto" 
         MaxHeight="600" MaxWidth="600"/>

答案 2 :(得分:0)

答案 3 :(得分:0)

如果文本有换行符,则将其分解为List字符串,然后使用带有TextBlock的ListBox。如果需要编辑,则使用TextBox。 ListBox支持虚拟化。因此,只需要重新调整显示的文本。

这会将多个空行连接到一个。并且有一个非标准的EOL。

bool lastNull = false;
string eol = ((char)174).ToString();
string[] docTextRaws = DocText.Split((char)174);
string docTextRaw;
for (Int32 j = 0; j < docTextRaws.Length; j++)
{
    docTextRaw = docTextRaws[j].TrimEnd();
    if (string.IsNullOrEmpty(docTextRaw))
    {
        if (!lastNull)
        {
            docTextDownloadLines.Add(eol);
            lastNull = true;
        }
    }
    else
    {
        docTextDownloadLines.Add(docTextRaw + eol);
        if (lastNull) lastNull = false;
    }
}