如何使WPF TreeViewItem中的文本自动换行?

4
这次,我的问题很简单...如何让文本在WPF的TreeViewItem中换行?
我有一个简单的HierarchicalDataTemplate,里面只有一个TextBlock
<TextBlock Text="{Binding Value}" TextWrapping="Wrap" />

这段文本不会自动换行。

我试过将TextBlockWidth绑定到TreeViewActualWidth,但是虽然这样可以使文本自动换行,但TreeViewItemWidth并没有适应TreeView因为TreeView有一个Padding。将其绑定到TreeViewItemActualWidth会产生同样的效果。另一个缺点是,即使是少量文本的项也会超出TreeView的边界。

<TextBlock Text="{Binding Value}" TextWrapping="Wrap" Width="{Binding ActualWidth, 
ElementName=TreeView}" />

当然,一定有更好的方法,比如让TreeViewItem知道TreeView的边界...我无法相信它不会自动知道。但是我该怎么做呢?
更新>>> 感谢H.B.的回答,我成功地将他在ControlTemplate中提到的BdBorderGrid.ColumnSpan更改为2,并设置了宽度,使文本现在可以很好地换行。问题是我正在使用这个ControlTemplate来处理其他TreeView中的TreeViewItem,而我不想要全宽度的项目。
我想出的解决办法很简单。我已经将TreeViewItem.Tag值绑定到ControlTemplate中的Grid.ColumnSpan属性上,如下所示:
<Border Grid.ColumnSpan="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" 
Name="Bd" Grid.Column="1" ... />

这让我可以通过将 TreeViewItem.Tag 的值分别设置为2或1来更改TreeViewItemGrid.ColumnSpan,从而实现全宽度或普通宽度行为。
1个回答

9
如果您查看TreeViewItems默认模板,您会看到一个类似于以下的网格:
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="19"
                          Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <!-- ... -->

您可以看到,第三列占用了所有可用的空间,而其他列是“自动”的,标题位于第二列内部边框中:

<Border Name="Bd"
        Grid.Column="1"
        ...

这意味着列的宽度将变得与标题一样大,没有任何限制。 因此,标题只是比TreeView本身更大。
如果您在此Border中添加Grid.ColumnSpan="2",它将占用第三列,其大小受剩余空间的限制,因此文本将换行; 然而,这会将标题扩展到整个宽度,当选择它时可能看起来有点奇怪。
当然,您还需要禁用水平滚动:
<TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled" ...

A screenshot


我本来希望有一个简单的属性,但那个方法很有效,非常感谢。+1 - Sheridan
@Sheridan:很高兴能帮到你 :) 如果默认模板中有某些硬编码的东西,那总是很糟糕的... - H.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接