我花了一些时间研究和观察最佳实践,以避免在尝试处理UI线程上的数据时阻塞UI线程。具体地说,我在可能的地方使用异步/等待。但是,当通过绑定填充DataGrid时,我注意到我的UI在命令处理完成并将处理传递回UI后冻结。
XAML
<DataGrid ItemsSource="{Binding EndpointModel.DataView}"
AutoGenerateColumns="True" IsReadOnly="True">
</DataGrid>DataModel命令执行:
public async void CommandExecute()
{
...
JsonData = await accessor.GetDataAsync(new Endpoint.Params().Universe(universe)
.WithStart(start)
.WithEnd(end));
// Creates a very large DataTable within my display (30 x 350)
var grid = EndpointModel.CreateDataGrid(JsonData);
EndpointModel.DataView = grid.AsDataView();
}我已经遍历了代码,观察了处理时间,放置了调试器消息,处理看起来很正常。await语句大约需要1.5秒,最后的网格处理是几毫秒。然而,当我从'CommandExecute()‘返回时,UI大约需要3-5秒才能响应。数据可以很好地填充--只是永远都需要。我不知道这是不是意料之中的事,也不知道我是否能控制它。
谢谢。
发布于 2019-03-28 08:28:56
WPF DataGrid以其性能问题而闻名。您可以尝试查看此thread的答案。基本上,最推荐的选择是:使用Grid。尤其是在行数为数千行的情况下。或者,如果您想保留数据网格,有一些方法可以减少加载时间,例如
EnableColumnVirtualization = true
EnableRowVirtualization = true另外设置固定的宽度和/或高度,datagrid可能会在每次更新数据时尝试重新计算所需的宽度和高度。我会检查其他线程,以根据您的需要优化您的数据网格。
https://stackoverflow.com/questions/55384325
复制相似问题