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

She*_*dan 2 wpf word-wrap treeviewitem

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

我有一个简单HierarchicalDataTemplate的只有一个TextBlock.

<TextBlock Text="{Binding Value}" TextWrapping="Wrap" />
Run Code Online (Sandbox Code Playgroud)

文字没有包装.

我想结合WidthTextBlockActualWidthTreeView,不过虽然这使得文字的环绕中,WidthTreeViewItem不适合的TreeView,因为TreeViewPadding.绑定到ActualWidthTreeViewItem有(意料之中)相同的效果.另一个缺点是,即使是文字很少的项目也会超出TreeView界限.

<TextBlock Text="{Binding Value}" TextWrapping="Wrap" Width="{Binding ActualWidth, 
ElementName=TreeView}" />
Run Code Online (Sandbox Code Playgroud)

当然,必须有一个更好的办法,像不知何故通知TreeViewItemTreeView的界限......我不能相信它不会自动知道.但是我怎么能这样做呢?

更新>>>

由于HB的答案,我设法改变Grid.ColumnSpan为2对Bd Border,他在提到ControlTemplate它设置宽度,使文本现在包装精美.问题是我在ControlTemplate其他TreeViewItems中使用它TreeView,我不想要全宽度的项目.

我想出的解决方案很简单.我已将TreeViewItem.Tag值绑定到Grid.ColumnSpan属性中,ControlTemplate因此:

<Border Grid.ColumnSpan="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" 
Name="Bd" Grid.Column="1" ... />
Run Code Online (Sandbox Code Playgroud)

这允许我通过将值分别设置为2或1 来改变Grid.ColumnSpan并因此改变全宽度或普通宽度行为.TreeViewItemTreeViewItem.Tag

H.B*_*.B. 8

如果您查看默认模板,TreeViewItems您将看到如下网格:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="19"
                          Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <!-- ... -->
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,第三列占用了所有可用空间而其他列处于打开状态时Auto,标题将放置在边框内的第二列中:

<Border Name="Bd"
        Grid.Column="1"
        ...
Run Code Online (Sandbox Code Playgroud)

这意味着该列将变得与标题一样大,对其没有限制.因此,标题只是比TreeView自己大.

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

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

<TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled" ...
Run Code Online (Sandbox Code Playgroud)

截图