2017-06-24 14 views
-1

私はバインド可能なTextBlock、つまりアイテムにバインドされたテキストブロックを作成しました。これらのアイテムは、テキストのレンダリング方法を定義するプロパティを持っています例)。TextTrimmingプロパティがカスタムTextBlockで機能しない

しかし、'TextTrimming`プロパティは私のカスタムテキストブロックのために動作しません、ここにコードがある:

class BindableTextBlock : TextBlock 
{ 
    public BindableTextBlock() 
    { 

    } 

    public bool HideWhenEmpty 
    { 
     get { return (bool)GetValue(HideWhenEmptyProperty); } 
     set { SetValue(HideWhenEmptyProperty, value); } 
    } 

    public static readonly DependencyProperty HideWhenEmptyProperty = 
     DependencyProperty.Register("HideWhenEmpty", typeof(bool), typeof(BindableTextBlock), new UIPropertyMetadata(false)); 

    public ObservableCollection<DescriptionToken> Items 
    { 
     get { return (ObservableCollection<DescriptionToken>)GetValue(ItemsProperty); } 
     set { SetValue(ItemsProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsProperty = 
     DependencyProperty.Register("Items", typeof(ObservableCollection<DescriptionToken>), typeof(BindableTextBlock), new UIPropertyMetadata(null, OnItemsPropertyChanged)); 

    private static void OnItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((BindableTextBlock)d).OnItemsChanged(); 
    } 

    private void OnItemsChanged() 
    { 
     if (Items == null) 
      return; 
     Items.CollectionChanged -= ItemsCollectionChanged; 
     Items.CollectionChanged += ItemsCollectionChanged; 

     BuildText(); 
    } 

    private void BuildText() 
    { 
     Inlines.Clear(); 
     if (Items == null || !Items.Any()) 
     { 
      if (HideWhenEmpty) 
       Visibility = System.Windows.Visibility.Collapsed; 
      return; 
     } 

     for (var i = 0; i < Items.Count; i++) 
     { 
      var item = Items[i]; 
      var run = new Run(TruncateText(item.Text)); 
      if (item.IsVariable) 
      { 
       run.Foreground = new SolidColorBrush(item.IsError ? Colors.Red : Colors.Blue); 
       run.FontStyle = FontStyles.Italic; 
      } 
      Inlines.Add(run); 
     } 

     Visibility = System.Windows.Visibility.Visible; 
     InvalidateVisual(); 
    } 

    private string TruncateText(string text) 
    { 
     if (string.IsNullOrEmpty(text)) 
      return text; 

     if (text.Contains(Environment.NewLine)) 
      return TruncateText(text.Substring(0, text.IndexOf(Environment.NewLine)) + "..."); 

     if (text.Length > 120) 
     { 
      var result = text.Substring(0, 120).TrimEnd('.'); 
      return result + "..."; 
     } 

     return text; 
    } 

    private void ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     BuildText(); 
    } 

Itemsが変わるたびに、テキストの色を設定するためにTextBlock.Inlinesを操作します。

XAMLは

<DataTemplate> 
<Border Padding="3"> 
      <StackPanel Grid.Column="1" Orientation="Vertical"> 

       <TextBlock Text="aaaaaaa aaaaaaaaaa aaaaaaaaaaaaa bbbbbb cccccccccc ddddddddddd eeeeeeeeeeeeeeee ffffffffffffffffff ggggggggggg" FontStyle="Italic" FontSize="10" TextTrimming="CharacterEllipsis"/> 
       <controls:BindableTextBlock Items="{Binding Description}" FontSize="10" 
              FontStyle="Italic" HideWhenEmpty="True" 
              TextTrimming="CharacterEllipsis"/> 
      </StackPanel> 
     </Border> 
     </DataTemplate> 

次の画像は、第一TextBlockがトリミングされていることを示しているが、第二(私は)ないです。 enter image description here

は、どのように同じように私のカスタムTextBlock仕事をするために通常TextBlockTextTrimmingについては?

+0

なぜdownvote ??? – JobaDiniz

答えて

0

コントロールが折り返してもトリミングできません。 したがって、このコードを削除します。

TextWrapping = System.Windows.TextWrapping.Wrap; 

コントロールのコンストラクタから削除します。

+0

後で削除しました(質問を更新するのを忘れてしまいました)。うまく動作しません。 – JobaDiniz

+0

私はすでにそれをテストしていると誓っていますが、それは 'TextWrapping'でした。ありがとう – JobaDiniz

+0

問題ありません、あなたは歓迎です@JobaDiniz –

関連する問題