質問

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();
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top