TextTrimming属性不适用于自定义TextBlock

时间:2017-06-24 19:58:52

标签: c# wpf xaml custom-controls

我创建了一个“可绑定”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>

下图显示第1 TextBlock被修剪,但第2(我的)不是: enter image description here

如何使我的自定义TextBlock与常规TextBlock关于TextTrimming属性一样工作?

1 个答案:

答案 0 :(得分:0)

如果您的控件包裹,则无法修剪。 所以删除此代码:

TextWrapping = System.Windows.TextWrapping.Wrap;

来自你的控件的构造函数。