WPF 文本框性能

Odr*_*rai 2 c# wpf xaml multithreading mvvm

我正在开发一个在单独线程中检索数据的应用程序。在线程内“调用”委托以获取视图模型中的数据。字符串属性将用于设置 WPF TextBox 的文本(数据绑定)。

视图模型

private string _resultText;
public string ResultText
{
    get
    {
        return _resultText;
    }
    set
    {
        _resultText = value;
        RaisePropertyChanged();
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML

<TextBox Name="tbxResult" Text="{Binding ResultText, Mode=TwoWay}" TextWrapping="NoWrap" Padding="10,10,10,10" IsReadOnly="True"/>
Run Code Online (Sandbox Code Playgroud)

该线程正在检索大量数据,这会导致性能问题。UI 将被冻结,直到检索到所有数据。我已经尝试使用 Binding IsAsync="True" 属性、 TextWrapping="NoWrap",在 ResultText 的设置器中调用 Dispatcher.Invoke 并检查问题'slow-wpf-textbox'

所提供的解决方案都无法提高性能。

执行以下代码会导致相同的(性能)问题:

private void btnRetrieveResultData_Click(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < 3000; i++)
    {
        tbxResult.Dispatcher.Invoke(() =>
        {
            tbxResult.AppendText("testMessage" + i);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

处理大量数据并将其显示在文本框中的解决方案/实现是什么?(它可能是另一个提供滚动和选择文本选项的控件)。

Evk*_*Evk 7

我不确定我是否理解您的问题,但我将使用“执行以下代码会导致相同的(性能)问题”,更改i为 300.000 以向文本框添加更多文本。将其更改为:

   private void ButtonClicked(object sender, RoutedEventArgs e) {
        Task.Run(() =>
        {
            for (int i = 0; i < 300000; i++) {
                tbxResult.Dispatcher.Invoke(() => {
                    tbxResult.AppendText("testMessage" + i + "\r\n");
                }, DispatcherPriority.Background);
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

以非常流畅的方式向文本框添加行,没有任何 UI 冻结,并且您实际上可以在添加项目时手动滚动文本框。