WPF DataGrid загружается >1 с для «несколько» данных (40x40)C#

Место общения программистов C#
Ответить
Anonymous
 WPF DataGrid загружается >1 с для «несколько» данных (40x40)

Сообщение Anonymous »

Я изо всех сил пытаюсь обеспечить разумное время загрузки для DataGrid разумного размера в WPF.
Мой пример очень простой и вставлен ниже. Он просто загружает сетку чисел 40x40 при нажатии кнопки, и пользовательский интерфейс замораживается на 1 секунду. Я запустил профилировщик VS, и загрузка макета, построенного из 4147 элементов визуального дерева, занимает 1,16 с.
У меня нет проблем с тем, что DataGrid требует времени. для загрузки, но я считаю проблемой то, что окно полностью зависает во время загрузки. Может ли кто-нибудь помочь мне загрузить DataGrid, сохраняя при этом отзывчивость моего окна?
Большое спасибо!
MainWindow.xaml MainWindow.xaml.cs

Код: Выделить всё

using System.Collections.ObjectModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Coliru
{
/// 
/// Interaction logic for MainWindow.xaml
/// 
public partial class MainWindow : Window
{
public class ViewModel
{
public class RowType
{
public ObservableCollection Columns
{
get => _Columns;
}

private ObservableCollection _Columns;

public RowType(ObservableCollection columns)
{
_Columns = columns;
}
}

public static readonly int numcol = 40;
public static readonly int numrow = 40;
public ObservableCollection Rows { get => _Rows; }
private ObservableCollection _Rows;

public ViewModel()
{
Random autoRand = new Random();
_Rows = new ObservableCollection();

for (int icol = 0; icol < numcol;++icol)
{
var rows = new ObservableCollection();
for (int irow = 0; irow < numrow; ++irow)
{
rows.Add(autoRand.NextDouble());
}

_Rows.Add(new(rows));
}

}

}

DataGrid? dataGrid;
ViewModel viewModel;
public MainWindow()
{
InitializeComponent();

viewModel = new ViewModel();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
dataGrid = new DataGrid();
dataGrid.Initialized += DataGrid_Initialized;

myContentControl.Content = dataGrid;
}

private void DataGrid_Initialized(object? sender, EventArgs e)
{
dataGrid.ItemsSource = viewModel.Rows;
dataGrid.AutoGenerateColumns = false;
for (int i = 0; i < ViewModel.numcol; ++i)
{
var col = new DataGridTextColumn();
var binding = new Binding();
binding.Path = new PropertyPath("Columns[" + i + "]");
col.Binding = binding;
col.Header = "Column " + i;
col.Width = 80;
dataGrid.Columns.Add(col);
}
}
}
}
Я пробовал много подходов, это всего лишь упрощенная версия проблемы. Я тоже пробовал MVVM.

Подробнее здесь: https://stackoverflow.com/questions/790 ... data-40x40
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»