如何在WPF TreeViewItem中进行文本换行?

时间:2012-01-19 23:32:23

标签: wpf textwrapping treeviewitem

这次,我的问题就像听起来一样简单......你如何在WPF TreeViewItem中包含文字?

我有一个简单的HierarchicalDataTemplate,其中只有一个TextBlock

<TextBlock Text="{Binding Value}" TextWrapping="Wrap" />

文字没有换行。

我尝试将Width的{​​{1}}绑定到TextBlock的{​​{1}},但是虽然这会使文本换行,但是ActualWidth TreeView不适合Width,因为TreeViewItemTreeView。绑定到TreeView的{​​{1}}具有(不出所料)相同的效果。另一个缺点是,即使是文本很少的项目也会超出Padding范围。

ActualWidth

当然必须有一种更好的方式,比如以某种方式告知TreeViewItem TreeView的界限......我无法相信它不会自动知道。但是我怎么能这样做呢?

更新&gt;&gt;&gt;

感谢HB的回答,我设法将<TextBlock Text="{Binding Value}" TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=TreeView}" /> 更改为TreeViewItem中提及的TreeView Grid.ColumnSpan,并设置了宽度,以便现在的文字包装得很好。问题是我在其他Bd中使用此Border用于我不想要全宽度项目的其他ControlTemplate

我想出的解决方案很简单。我将ControlTemplate值绑定到TreeViewItem中的TreeView属性,如下所示:

TreeViewItem.Tag

这允许我通过将Grid.ColumnSpan值分别设置为2或1来更改ControlTemplate,从而更改<Border Grid.ColumnSpan="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" Name="Bd" Grid.Column="1" ... /> 的全宽或普通宽度行为。

1 个答案:

答案 0 :(得分:8)

如果您查看TreeViewItems的{​​{3}},您会看到这样的网格:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="19"
                          Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <!-- ... -->

正如您所看到的,第三列占用了所有可用空间,而其他列位于Auto上,标题位于边框内的第二列:

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

这意味着该列将变得与标题一样大,对其没有限制。因此,标题只会比TreeView本身更大。

如果你将Grid.ColumnSpan="2"添加到此边框,它也会占据第三列,这受到剩余空间的限制,因此文本将会换行;然而,这将在整个宽度上扩展标题,这在选择它时可能看起来有些奇怪。

当然,您还需要禁用水平滚动:

<TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled" ...

A screenshot