虽然我稍微简化了一下这个要求,但是我需要显示一些带下划线的字符,而有些字符不在ListBox项中 - 在从数据库读取的字符串中使用下划线来指示哪些字符需要在GUI上加粗。
例如,如果一个字符串包含“The f_at ca_t sat”,那么ListBox中显示的项目将只有a和t加下划线。
我真的不知道如何实现这一点 - 我想我需要以某种方式定义一个ItemTemplate但是当你不知道哪个文本会提前加下划线(或者即使有任何带下划线的文本)那么你无法定义< Run>元件。
非常感谢任何帮助。
答案 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>