WPF Toolkit AutoCompleteBox背景スレッドでの検索
-
14-10-2019 - |
質問
ItemsSourceがオブジェクトのミリオンのリストであるというWPF Toolkit AutoCompleteBoxを使用しています。
AutoCompleteBoxは、バックグラウンドスレッドの検索に使用されますか?
解決
いいえ、背景スレッドは使用しません。自分でソースを読むことができます wpf towit. 。ただし、バックグラウンドスレッドで自分で行うことができるほど柔軟です。
このアプローチを使用できます。
- を処理します
Populating
イベント:キャンセルし、バックグラウンドワーカーを使用して始めますSearchText
- バックグラウンドワーカーが完了したら:設定します
ItemsSource
そして電話してくださいPopulateComplete
MSDNドキュメントには、この完全な例があります。
その例では、非同期Webサービスを使用して自動コンプリートデータを入力しますが、非常に大きなデータセットの検索にも同じアイデアが当てはまります。背景スレッド
アップデート:
以下は、バックグラウンドスレッドで検索が発生する完全な例です。長い検索をシミュレートするための1秒の睡眠が含まれています。
private class PopulateInfo
{
public AutoCompleteBox AutoCompleteBox { get; set; }
public string SearchText { get; set; }
public IEnumerable<string> Results { get; set; }
}
private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e)
{
var populateInfo = new PopulateInfo
{
AutoCompleteBox = sender as AutoCompleteBox,
SearchText = (sender as AutoCompleteBox).SearchText,
};
e.Cancel = true;
var ui = TaskScheduler.FromCurrentSynchronizationContext();
var populate = Task.Factory.StartNew<PopulateInfo>(() => Populate(populateInfo));
populate.ContinueWith(task => OnPopulateComplete(task.Result), ui);
}
private PopulateInfo Populate(PopulateInfo populateInfo)
{
var candidates = new string[] {
"Abc",
"Def",
"Ghi",
};
populateInfo.Results = candidates
.Where(candidate => candidate.StartsWith(populateInfo.SearchText, StringComparison.InvariantCultureIgnoreCase))
.ToList();
Thread.Sleep(1000);
return populateInfo;
}
private void OnPopulateComplete(PopulateInfo populateInfo)
{
if (populateInfo.SearchText == populateInfo.AutoCompleteBox.SearchText)
{
populateInfo.AutoCompleteBox.ItemsSource = populateInfo.Results;
populateInfo.AutoCompleteBox.PopulateComplete();
}
}
所属していません StackOverflow