使用.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有一个快速的玩法,它有同样的问题。我找不到描述这个问题的任何其他线程,这似乎很奇怪。
有什么建议吗?
谢谢, 富
答案 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)
为什么不使用FlowDocumentScrollViewer
代替TextBlock
http://msdn.microsoft.com/en-us/library/system.windows.controls.flowdocumentscrollviewer.aspx
答案 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;
}
}