WPF Listview文本框突出显示

时间:2012-11-12 13:54:01

标签: c# wpf

我有一个列出了客户信息的列表视图。我通过在文本框中键入来突出显示列表视图项。例如,当我在文本框中键入“PET”时,它会突出显示listview项目中的“PET”。它的工作和亮点。

但在此之后,当我点击突出显示的项目时,它会出错。但是当我点击listview项目中的空闲位置时它很有趣。例如,它突出了PETER HEINZ。如果我点击PETER或HEINZ,它会给出错误。但是,如果我点击PETER HEINZ之间的空间就行了。这有什么错误?错误消息是

System.InvalidOperationException未处理   Message =“'System.Windows.Documents.Run'不是Visual或Visual3D。”

源代码如下:

private void HighlightText(Object itx)
    {
 if (itx != null)
        {
            if (itx is TextBlock)
            {
                Regex regex = new Regex("(" + textBox1.Text + ")", RegexOptions.IgnoreCase);
                TextBlock tb = itx as TextBlock;
                if (textBox1.Text.Length == 0)
                {
                    string str = tb.Text;
                    tb.Inlines.Clear();
                    tb.Inlines.Add(str);
                    return;
                }
                string[] substrings = regex.Split(tb.Text);
                tb.Inlines.Clear();
                foreach (var item in substrings)
                {
                    if (regex.Match(item).Success)
                    {
                        Run runx = new Run(item);
                        runx.Background = Brushes.LightGray;
                        tb.Inlines.Add(runx);
                    }
                    else
                    {
                        tb.Inlines.Add(item);
                    }
                }
                return;
            }
            else
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(itx as DependencyObject); i++)
                {
                    HighlightText(VisualTreeHelper.GetChild(itx as DependencyObject, i));
                }
            }
        }

    }

1 个答案:

答案 0 :(得分:0)

这是一个修改。你可以把它贴在你的上面,看看它在你的应用程序中效果更好吗?

关键点:

  • 添加了保护,不让非可视对象进入GetChild递归
  • 添加了textbox1为空的检查
  • trivial:移动tb.inlines.clear以减少代码重现
  • trivial:反转itx null检查以减少嵌套

private void HighlightText(Object itx)
{
    //safety checks
    if (itx == null)
        return;        
    if (String.isNullOrEmpty(textBox1.Text)
        return; //just in case the box is empty
    if (! (itx is Visual || itx is System.Windows.Media.Media3D.Visual3D)
        return;  //prevent from getting children on non-visual element

    if (itx is TextBlock)
    {
        Regex regex = new Regex("(" + textBox1.Text + ")", RegexOptions.IgnoreCase);
        TextBlock tb = itx as TextBlock;
        tb.Inlines.Clear();
        if (textBox1.Text.Length == 0)
        {
            string str = tb.Text;
            tb.Inlines.Add(str);
            return;
        }
        string[] substrings = regex.Split(tb.Text);
        foreach (var item in substrings)
        {

            if (!regex.Match(item).Success)
            {
                Run runx = new Run(item);
                runx.Background = Brushes.LightGray;
                tb.Inlines.Add(runx);
            }
            else
            {
                tb.Inlines.Add(item);
            }
        }
        return;
    }
    else
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(itx as DependencyObject); i++)
        {
            HighlightText(VisualTreeHelper.GetChild(itx as DependencyObject, i));
        }
    }
}