3

使用 .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

4 回答 4

2

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

我猜你获得了性能,但失去了一些视觉天赋。

于 2012-06-15T14:57:17.207 回答
2

缓慢的部分是一次显示所有文本。在我的控件中的 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"/>
于 2017-07-06T19:35:14.923 回答
0

为什么不使用 aFlowDocumentScrollViewer而不是 aTextBlock

http://msdn.microsoft.com/en-us/library/system.windows.controls.flowdocumentscrollviewer.aspx

于 2012-06-15T09:48:39.930 回答
-1

如果文本有换行符,则将其分解为 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;
    }
}
于 2012-06-15T12:18:22.273 回答