2

我正在寻找一种方法来突出显示我的自定义 ListView 控件中的一些搜索词。我有一堆 TextBlocks(每行的每个属性一个)。例如每首歌曲的艺术家姓名、标题和流派。

现在,如果有人搜索“Emi”,那么我希望艺术家字段显示为<b>Emi</b>nem,如果绑定的值为 Eminem。

我环顾四周,但并没有变得更明智。我想我需要一些转换器和使用 Inlines(我以前从未使用过)和/或 InlineExpressions(或者那些仅用于 ASP?)的组合。

所有绑定和模板都是在 C# 而不是 XAML 中动态创建的。

谢谢!

4

1 回答 1

2

是的,使用转换器(实际上它甚至可能是多转换器)和 TextBlock 的 Inlines 集合是正确的。因此,假设您正在将搜索项(在您的情况下为“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(...) {...}
    }
于 2013-06-16T08:00:21.780 回答