我有一个列出了客户信息的列表视图。我通过在文本框中键入来突出显示列表视图项。例如,当我在文本框中键入“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));
}
}
}
}
答案 0 :(得分:0)
这是一个修改。你可以把它贴在你的上面,看看它在你的应用程序中效果更好吗?
关键点:
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));
}
}
}