这次,我的问题就像听起来一样简单......你如何在WPF TreeViewItem
中包含文字?
我有一个简单的HierarchicalDataTemplate
,其中只有一个TextBlock
。
<TextBlock Text="{Binding Value}" TextWrapping="Wrap" />
文字没有换行。
我尝试将Width
的{{1}}绑定到TextBlock
的{{1}},但是虽然这会使文本换行,但是ActualWidth
TreeView
不适合Width
,因为TreeViewItem
有TreeView
。绑定到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" ... />
的全宽或普通宽度行为。
答案 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" ...