文本框性能不佳,带有换行和大量数据
本文关键字:换行 数据 性能 文本 | 更新日期: 2023-09-27 18:37:12
我在使用 .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" />
文本绑定到单个字符串。绑定数据未更改。
编辑:调整窗口大小时数据没有更改,这就是我的意思。它将在未来更新。文本框不需要可编辑,但实际文本需要可选。/编辑。
我快速玩过AvalonEdit,它有同样的问题。似乎很奇怪,我找不到任何其他描述此问题的线程。
有什么建议吗?
谢谢富
慢的部分是一次显示所有文本。我之前遇到过这个问题,我的控件中的文本框变得非常大,并且整个控件都有一个滚动查看器来处理非常大的文本框。
您几乎正在这样做,但是如果没有为您的高度/宽度设置最大值,我不确定您的 ScrollViewer 是否真的会被使用。
我的解决方案是使用文本框中的内置scrollViewer(您正在这样做),然后限制文本框的高度/宽度的大小,以便它不会尝试一次呈现100%的文本(并且实际上利用了文本框中的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"/>
您可以对 windowResizeStart 事件做出反应并禁用文本块的换行。然后在调整大小完成后仅换行一次。
我猜你获得了性能,但失去了一些视觉天赋。
为什么不使用FlowDocumentScrollViewer
而不是TextBlock
http://msdn.microsoft.com/en-us/library/system.windows.controls.flowdocumentscrollviewer.aspx
如果文本有换行符,则将其分解为列表字符串,然后使用带有 TextBlock 的列表框。 如果需要编辑,请使用文本框。 列表框支持虚拟化。 因此,只有显示的文本需要调整大小。
这会将多个空行连接为一个。 并具有非标准 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;
}
}