У меня есть страница с большим количеством компонентов, для загрузки которой требуется несколько секунд.WPF Toolkit DataGrid, отображаемый с неправильной шириной столбца
Моя проблема заключается в том, что страница отображается перед Компоненты DataGrid подсчитали ширину столбца, и пользователь может видеть рендеринг на экране.
Я построил очень простой пример: DataGrid имеет 3 столбцов, первый столбец имеет Width="*"
и другие столбцы имеют фиксированную ширину. Столбцы с фиксированной шириной правильно визуализации с самого начала, но колонна звезда оказывается с шириной 20.
После секунду DataGrid вычисляет правильную ширину столбца звезды и делает сетку правильно:
Мой пример XAML:
<ScrollViewer>
<Controls:DataGrid Name="mainTable" AutoGenerateColumns="False">
<Controls:DataGrid.Columns>
<Controls:DataGridTemplateColumn Header="col 0" Width="*">
<Controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Col0}" />
</DataTemplate>
</Controls:DataGridTemplateColumn.CellTemplate>
</Controls:DataGridTemplateColumn>
<Controls:DataGridTextColumn Header="col 1" Binding="{Binding Col1}" Width="150" />
<Controls:DataGridTextColumn Header="col 2" Binding="{Binding Col2}" Width="150" />
</Controls:DataGrid.Columns>
</Controls:DataGrid>
И код позади:
public MainWindow()
{
InitializeComponent();
var rows = new List<RowObj>();
for (int i = 0; i < 5000; i++)
{
rows.Add(new RowObj
{
Col0 = "col0," + i,
Col1 = "col1," + i,
Col2 = "col2," + i,
Col3 = "col3," + i,
Col4 = "col4," + i,
});
}
mainTable.ItemsSource = rows;
}
Как примечание: Я использую WpfToolkit (последний выпуск, начиная с 2010 года) и .NET 3.5 И я не могу перейти к компонентам WPF4.
Любая идея, как устранить проблему с загрузкой?
Попробуйте переместить логику генерации списка строк, прежде чем 'InitializeComponent()'. –
@RohitVats: не помогает, в большинстве случаев он будет генерировать исключение, так как элементы управления еще не созданы. Фактический рендеринг не возникает во время привязки, поэтому установка данных действительно может быть выполнена в событиях инициализации или загрузки с тем же результатом. –
Я имел в виду только перемещение части списка, а не назначение - 'mainTable.ItemsSource = rows;'. Это должно быть ниже 'InitializeComponent()' только. –