【发布时间】:2021-01-03 11:46:17
【问题描述】:
我想向 NavigationView 添加 1500 个项目 我使用了actionblock,但它仍然很慢,在ui中添加项目大约需要10秒
private ObservableCollection<NavigationViewItem> data;
TaskScheduler taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
private void DoSomethingWithCustomer(NavigationViewItem c)
{
Task.Run(() =>
{
data.Add(c);
}).ContinueWith(x =>
{
NavigationView.MenuItemsSource = data;
}, taskScheduler);
}
和:
ActionBlock<NavigationViewItem> action = new ActionBlock<NavigationViewItem>(DoSomethingWithCustomer, new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
});
var coll = System.IO.Directory.EnumerateDirectories("D:\\Pic\\Art");
foreach (var customer in coll)
{
var item = new NavigationViewItem { Content = new DirectoryInfo(customer).Name };
action.Post(item);
}
action.Complete();
await action.Completion;
我试过了,EnumerateDirectories 不到 1 秒就完成了,但是添加项目到 ui 需要很长时间
【问题讨论】:
-
我以前也遇到过类似的问题,这是因为 UI 试图渲染这些项目,即使它们不在视图中。如果我记得,我的解决方案是设置一个标志,以不尝试渲染实际上不在屏幕中的项目。或者我不得不使用不同的控件。记不清了,但问题是 UI 实际上是在尝试绘制所有正在添加的项目,而且这似乎也是你的问题。
标签: c# uwp navigationview