使ListBox项中的一些字符加下划线

时间:2017-02-26 19:01:36

标签: c# wpf listbox

虽然我稍微简化了一下这个要求,但是我需要显示一些带下划线的字符,而有些字符不在ListBox项中 - 在从数据库读取的字符串中使用下划线来指示哪些字符需要在GUI上加粗。

例如,如果一个字符串包含“The f_at ca_t sat”,那么ListBox中显示的项目将只有a和t加下划线。

我真的不知道如何实现这一点 - 我想我需要以某种方式定义一个ItemTemplate但是当你不知道哪个文本会提前加下划线(或者即使有任何带下划线的文本)那么你无法定义< Run>元件。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

不幸的是,您无法绑定TextBlock的Inlines属性。

但是,您可以使用PropertyChangedCallback创建一个可以直接访问Inlines集合的附加属性:

public static class TextBlockEx
{
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.RegisterAttached(
            "Text",
            typeof(string),
            typeof(TextBlockEx),
            new PropertyMetadata(null, TextPropertyChanged));

    public static string GetText(DependencyObject obj)
    {
        return (string)obj.GetValue(TextProperty);
    }

    public static void SetText(DependencyObject obj, string value)
    {
        obj.SetValue(TextProperty, value);
    }

    private static void TextPropertyChanged(
        DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var textBlock = obj as TextBlock;

        if (textBlock != null)
        {
            var text = (string)e.NewValue;

            textBlock.Inlines.Clear();
            // textBlock.Inlines.Add(new Run(text));
            // add Runs and Underlines as necessary here
        }
    }
}

鉴于您的ListBox绑定到字符串集合,您将在XAML中使用此属性,如下所示:

<ListBox ItemsSource="{Binding Strings}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock local:TextBlockEx.Text="{Binding}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>