моя задача довольно распространенная, у меня густонаселенное дерево, которое я хочу отфильтровать. Для этого я хочу иметь текстовое поле, которое пользователь вводит в свой текст фильтра и после того, как древовидное представление отфильтровано, чтобы показать узлы с этим конкретным текстом фильтра в заголовке.
так что я решил использовать текстовое поле с событием изменения текста, которое имеет задержку до начала процесса фильтрации, теперь, очевидно, если текст фильтра изменяется до того, как задержка заканчивается, я хочу отменить обработайте и начните новый с новым текстом соответствия.
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace pav.skillsToCompetenciesMapper.Views
{
public partial class MapSkillsPage : Page
{
CancellationTokenSource cts;
private async void Search_TEXTBOX_TextChanged(object sender, TextChangedEventArgs e)
{
if (cts != null) cts.Cancel();
var searchText = Search_TEXTBOX.Text;
try
{
using (cts = cts ?? new CancellationTokenSource())
await Task.Delay(3000, cts.Token).ContinueWith(tr =>
{
var st = searchText;
//Do search here
}, TaskContinuationOptions.NotOnCanceled);
}
catch (OperationCanceledException) { }
finally { cts = null; }
}
}
}
Теперь вышеупомянутое, кажется, работает для меня, я просто волнуюсь, что это решение try catch немного неуклюже, на самом деле мне кажется, что я должен иметь возможность использовать TaskContinuation.OnlyOnCanceled, чтобы избежать использования try catch для логики. , для меня это просто запах кода, но это примечание.
Моя настоящая проблема возникает, когда я пытаюсь действительно выполнить поиск в древовидной структуре, например, где приведенный выше комментарий «Выполнить поиск здесь» равен
foreach (TreeViewItem category in Abilities_TreeView.Items)
foreach (DragableTreeViewItem ability in category.Items)
if (!ability.Header.ToString().Contains(filterText))
ability.Visibility = Visibility.Hidden;
Любая помощь по этому вопросу будет принята с благодарностью, я подозреваю, что это как-то связано с попыткой доступа к потоку пользовательского интерфейса из фонового потока, но я не уверен на 100%, если я лаю нужное дерево .