У меня есть пользовательский элемент управления, который часто имеет 2000 или около того компонентных элементов управления (TextBoxes, TextBlocks, ComboBoxes и т. Д.), И мое приложение работает не так быстро, как хотелось бы.
Поначалу 2000 элементов управления могут показаться большими, но на самом деле они представляют собой только сетку данных WPF с 10 столбцами и 200 строками, что часто встречается во многих приложениях.
Вот очень простой пример, который, по моему мнению, имитирует такую сетку данных, и я наблюдаю время рендеринга около 200 мс:
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.
Что я могу сделать, чтобы ускорить время загрузки элементов управления, которые содержат много данных?