【发布时间】:2019-01-14 22:42:07
【问题描述】:
我有一个WPF TreeView,其中填充了许多子控件。自己有孩子的都是TreeViewItems,没有孩子的都是Checkboxes。目前它有大约 1,600 个Checkbox 孩子和子孩子。我还有一个Textbox,它用于通过匹配checkboxesTags中的数据来搜索树。
以下代码在将密钥键入Textbox 时过滤TreeView。如果在 Textbox 为空时触发此事件,则会运行不同的算法,该算法会显示所有子代并折叠 TreeViewItems 的子代。
我的问题有两个部分,为什么过滤方法不能正常工作?它允许不满足搜索词的结果。
其次,如何优化搜索功能?它目前将我的 UI 线程锁定了几秒钟,而 ShowAndCollapse 算法似乎没有。
// 'MainTree' is my TreeView being searched through
private void SearchTermTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;
if (textBox.Text.Length == 0)
{
ShowAndCollapse(MainTree);
}
else
{
Filter(MainTree, textBox.Text);
}
}
private void ShowAndCollapse(ItemsControl parent)
{
foreach (Control control in parent.Items)
{
control.Visibility = Visibility.Visible;
if (control is TreeViewItem treeViewItem)
{
ShowAndCollapse(treeViewItem);
treeViewItem.IsExpanded = false;
}
}
}
private void Filter(ItemsControl parent, string searchTerm)
{
foreach (Control child in parent.Items)
{
if (child is TreeViewItem treeViewItem)
{
Filter(treeViewItem, searchTerm);
if (IsEmpty(treeViewItem))
{
treeViewItem.IsExpanded = false;
treeViewItem.Visibility = Visibility.Collapsed;
}
else
{
treeViewItem.IsExpanded = true;
treeViewItem.Visibility = Visibility.Visible;
}
}
else if (child is CheckBox checkBox)
{
foreach (string term in searchTerm.ToLower().Split(' '))
{
if (!checkBox.Tag.ToString().ToLower().Contains(term))
{
checkBox.Visibility = Visibility.Collapsed;
return;
}
}
checkBox.Visibility = Visibility.Visible;
}
else
throw new Exception("Unexpected child type!");
}
}
private bool IsEmpty(TreeViewItem treeViewItem)
{
foreach (Control item in treeViewItem.Items)
{
if (item.Visibility == Visibility.Visible)
{
return false;
}
}
return true;
}
谢谢!
【问题讨论】:
-
1.我认为您的方法
Filter中的return语句可能是问题所在,可能的解决方法是在 if 语句中使用break并将 checkbox.Visibility = Visibility.Visible 移动到for循环上方。 2.要优化方法,请考虑使用async-await -
啊-是的,就是这样-谢谢
-
不客气。根据网站指南,我发布了我的评论作为答案,因为它解决了您的问题。如果您对它感到满意,请将其标记为已接受的答案。
-
感谢您的支持和接受的答案。