gpt4 book ai didi

c# - UI 上的多线程 WPF

转载 作者:太空狗 更新时间:2023-10-30 00:31:49 26 4
gpt4 key购买 nike

在我的 C# WPF 应用程序中,我有一个 DataGrid,在它的正上方有一个 TextBox,供用户在键入时搜索和过滤网格。但是,如果用户键入速度很快,则直到他们键入后 2 秒才会出现文本,因为 UI 线程太忙于更新网格。

由于大部分延迟都发生在 UI 端(即过滤数据源几乎是即时的,但重新绑定(bind)和重新渲染网格很慢),多线程没有帮助。然后我尝试将网格的调度程序设置为在网格更新时处于较低级别,但这也没有解决问题。这是一些代码...关于如何解决此类问题的任何建议?

string strSearchQuery = txtFindCompany.Text.Trim();

this.dgCompanies.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(delegate
{
//filter data source, then
dgCompanies.ItemsSource = oFilteredCompanies;
}));

最佳答案

使用 ListCollectionView 作为网格的 ItemsSource 并更新 Filter 比重新分配 ItemsSource 快得多。

下面的示例通过简单地刷新搜索词文本属性的 setter 中的 View 来过滤 100000 行,没有明显的延迟。

View 模型

class ViewModel
{
private List<string> _collection = new List<string>();
private string _searchTerm;

public ListCollectionView ValuesView { get; set; }

public string SearchTerm
{
get
{
return _searchTerm;
}
set
{
_searchTerm = value;
ValuesView.Refresh();
}
}

public ViewModel()
{
_collection.AddRange(Enumerable.Range(0, 100000).Select(p => Guid.NewGuid().ToString()));

ValuesView = new ListCollectionView(_collection);
ValuesView.Filter = o =>
{
var listValue = (string)o;
return string.IsNullOrEmpty(_searchTerm) || listValue.Contains(_searchTerm);
};
}
}

查看

<TextBox Grid.Row="0" Text="{Binding SearchTerm, UpdateSourceTrigger=PropertyChanged}" />

<ListBox ItemsSource="{Binding ValuesView}"
Grid.Row="1" />

关于c# - UI 上的多线程 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22329510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com