2017-02-26 31 views
0

要件をわずかに簡略化していますが、一部の文字に下線を付ける必要があります。リストボックス項目にはいくつかの文字を表示する必要があります。 GUI上で太字にします。リストボックス項目の一部の文字を下線付きにする

たとえば、文字列に "The f_at ca_t sat"が含まれている場合、ListBoxに表示される項目には、aとtにアンダーラインが付きます。

これを達成する方法が実際にはわかりません - 何らかの理由でItemTemplateを定義する必要があると思いますが、どのテキストに下線が引かれるのか(下線付きのテキストがある場合でも) <要素を実行してください>要素を定義することはできません。

大変助かりました。

答えて

1

残念ながら、TextBlockの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 
     } 
    } 
} 

は、あなたがこのようにXAMLでプロパティを使用します。

ただし、直接InlinesコレクションにアクセスPropertyChangedCallbackで添付プロパティを作成することがあります。

<ListBox ItemsSource="{Binding Strings}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock local:TextBlockEx.Text="{Binding}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
関連する問題