TextTrimming 属性 不适用于自定义 TextBlock
TextTrimming property does not work for a custom TextBlock
我创建了一个 "bindable" 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
被修剪了,但第二个(我的)没有:
如何使我的自定义 TextBlock
像常规 TextBlock
一样工作 TextTrimming
属性?
如果您的控件换行,则不能 trim。
所以删除这段代码:
TextWrapping = System.Windows.TextWrapping.Wrap;
来自控件的构造函数。
我创建了一个 "bindable" 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
被修剪了,但第二个(我的)没有:
如何使我的自定义 TextBlock
像常规 TextBlock
一样工作 TextTrimming
属性?
如果您的控件换行,则不能 trim。 所以删除这段代码:
TextWrapping = System.Windows.TextWrapping.Wrap;
来自控件的构造函数。