如何使用大量数据加速WPF控件的渲染?

时间:2011-08-31 23:21:15

标签: wpf performance

我有一个用户控件,通常有2000个左右的组件控件(TextBoxes,TextBlocks,ComboBoxes等),我的应用程序运行速度不如我想的那么快。

虽然2000控件起初可能看起来很多,但它实际上只代表具有10列和200行的WPF数据网格 - 这是许多应用程序中的常见场景。

这是一个非常简单的示例,我认为它模仿了这样的数据网格,而且我看到了大约200ms的渲染时间:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Stopwatch stopwatch = Stopwatch.StartNew();

        ScrollViewer scrollViewer = new ScrollViewer();
        StackPanel stackPanel = new StackPanel();

        for (int rowIndex = 0; rowIndex < 200; rowIndex++)
            for (int columnIndex = 0; columnIndex < 10; columnIndex++)
                stackPanel.Children.Add(new TextBlock { Text = Guid.NewGuid().ToString() });

        scrollViewer.Content = stackPanel;
        this.Content = scrollViewer;

        UpdateLayout(); // Force a UI layout so we can get an accurate stopwatch reading
        MessageBox.Show(stopwatch.Elapsed.ToString(), "UI Layout Time");
    }

这就像我想到的那样简单,但是200毫秒仍然足以让用户注意到并且可能认为软件很慢。

如果这是一个真正的数据网格控件,那么控件很可能比TextBlocks更复杂,并且可能会有更多的时间,比如IValueConverters和Styles / DataTemplates。

我有什么办法可以加快拥有大量数据的控件的加载时间吗?

1 个答案:

答案 0 :(得分:3)

检查概念:UI Virtualization。如果您对可视区域没有太多控制,它应该会有所帮助。