0

顧客情報をバインドするリストビューがあります。テキスト ボックスに入力して、リストビューの項目を強調表示します。たとえば、テキストボックスに「PET」と入力すると、リストビュー項目の「PET」が強調表示されます。それは機能し、強調します。

しかし、その後、強調表示された項目をクリックすると、エラーが発生します。しかし、リストビュー項目の空いている場所をクリックすると、それが機能するのは興味深いことです。たとえば、ピーター・ハインツが強調されました。PETER または HEINZ をクリックすると、エラーが発生します。しかし、PETER HEINZ の間のスペースをクリックすると機能します。これは何のエラーですか?エラーメッセージは

System.InvalidOperationException は処理されませんでした Message="'System.Windows.Documents.Run' is not a Visual or 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));
                }
            }
        }

    }
4

1 に答える 1

0

ここに改訂があります。あなたのものの上に貼り付けて、アプリケーションでよりうまく機能するかどうかを確認できますか?

キーポイント:

  • 非ビジュアル オブジェクトが GetChild 再帰に到達しないように保護を追加しました
  • textbox1 が空であることのチェックを追加
  • 自明: コードの繰り返しを減らすために tb.inlines.clear を移動しました
  • 自明: 入れ子を減らすための反転 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));
        }
    }
}
于 2012-11-13T13:58:25.383 に答える