stu*_*bax 3 wpf listbox textblock scrollviewer texttrimming
正如您在stackoverflow帖子中看到的那样,当ListBox的大小变小时,此代码不会修剪TextBlock的文本.
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
该列表框显示了HorizontalScrollBar
-换句话说,房间的TextBlock足够大并且在文字修剪没有必要.这可以使用下一行代码解决:
<ListBox ...
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
... />
Run Code Online (Sandbox Code Playgroud)
所以现在文本将被修剪.但是,如果我不想修剪整个文本,直到唯一...会留下来?让说,我设置MinWidth
了的TextBlock的财产,并在宽度列表框 becames小于MinWidth
,我想HorizontalScrollBar
becames可见.
我试图处理SizeChanged
事件,并根据条件设置ScrollViewer.HorizontalScrollBarVisibility
附加属性.但是当我将后者Disabled
改为时,文本就不会被修剪Visible
- 所以它以某种方式跳转 - 从修剪到完全,这不是最好的UI练习.
问:那么,如何实现上述行为?
该TextBlock
在WPF真的不希望削减它的文本.当没有足够的空间时它会这样做,但是一旦ScrollViewer
可以滚动,就TextBlock
认为它有无限的可用空间,所以它不会修剪.
我认为,要做到这一点最简单的方法是设置MaxWidth
在TextBlock
到ActualWidth
的ListBox
:
<DataTemplate>
<TextBlock Text="{Binding}"
TextTrimming="CharacterEllipsis"
MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
对于默认的WPF ListBox
Style
(这会导致滚动条仍然出现),这将会有点过大.我会写一个自定义转换器从这个值中减去大约8:
public FudgeFactorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return Binding.DoNothing;
return (double)value - 8; // you will probably need to tweak this
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
Run Code Online (Sandbox Code Playgroud)
然后用它来转换MaxWidth
:
<DataTemplate>
<DataTemplate.Resources>
<my:FudgeFactorConverter x:Key="fudgeFactorConverter" />
</DataTemplate.Resources>
<TextBlock Text="{Binding}"
TextTrimming="CharacterEllipsis"
MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Converter={StaticResource fudgeFactorConverter}}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
作为奖励,如果你设置ListBox.MinWidth
,你将不必启用/禁用水平滚动条.
归档时间: |
|
查看次数: |
2699 次 |
最近记录: |