Мой пример очень простой и вставлен ниже. Он просто загружает сетку чисел 40x40 при нажатии кнопки, и пользовательский интерфейс замораживается на 1 секунду. Я запустил профилировщик VS, и загрузка макета, построенного из 4147 элементов визуального дерева, занимает 1,16 с.
У меня нет проблем с тем, что DataGrid требует времени. для загрузки, но я считаю проблемой то, что окно полностью зависает во время загрузки. Может ли кто-нибудь помочь мне загрузить DataGrid, сохраняя при этом отзывчивость моего окна?
Большое спасибо!
MainWindow.xaml
Код: Выделить всё
Код: Выделить всё
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);
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... data-40x40
Мобильная версия