我正在寻找一种方法来突出我的自定义ListView控件中的一些搜索词。我有一堆TextBlocks(每行一个属性)。例如,每首歌的艺术家姓名,标题和流派。
现在,如果有人搜索“Emi”,那么我希望艺术家字段显示为<b>Emi</b>nem
,如果绑定的值是Eminem。
我已经环顾四周,但并没有更明智。我想我需要一些转换器的组合和使用Inlines(我之前从未使用过)和/或InlineExpressions(或者仅适用于ASP?)。
所有绑定和模板都是在C#中即时创建的,而不是XAML。
谢谢!
答案 0 :(得分:2)
是的,你是正确的使用转换器(实际上它甚至可能是多通道)和Inline集合的TextBlock。 因此,假设您将搜索项(在您的案例中为'Emi')传递给转换器。您还需要以某种方式操作带有结果文本的TextBlock。为简单起见,我们假设TextBlock的Tag属性(不是Text)包含被搜索的整个字符串(单词'Eminem')。
class HighlightPartOfTextConverter : IValueConverter {
public object Convert(object value/*this is TextBlock*/, Type type, object parameter/*this is 'Emi'*/, CultureInfo ci){
var textBlock = value as TextBlock;
string str = textBlock.Tag as string;
string searchThis = parameter as string;
int index = str.IndexOf(searchThis);
if(index >= 0){
string before = str.Substring(0, index);
string after = str.Substring(index + searchThis.Length);
textBlock.Inlines.Clear();
textBlock.Inlines.Add(new Run(){Text=before});
textBlock.Inlines.Add(new Run(){Text=searchThis, FontWeight = FontWeights.Bold});
textBlock.Inlines.Add(new Run(){Text=after});
}
return "";
}
public object ConvertBack(...) {...}
}