У меня есть TreeView с тремя уровнями, управляемыми HierarchicalDataTemplate
.Вот частичный листинг xaml:
<TreeView
Name="TreeView"
ItemsSource="{Binding GTOs}"
ScrollViewer.HorizontalScrollBarVisibility="Hidden">
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<!-- This binding prevents the TreeView from slipping over to the right when an item is clicked. -->
<StackPanel MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=ContentPresenter, AncestorLevel=1}}" />
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:TreeGTOViewModel}" ItemsSource="{Binding Children}">
<TextBlock
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeView}}, Path=ActualWidth}"
MouseDown="TextBlock_MouseDown"
Tag="{Binding Uri}"
Text="{Binding Title}" />
</HierarchicalDataTemplate>
Атрибут Binding
в Width
TextBlock гарантирует, что каждый TreeViewItem
предполагает полную ширину контейнера TreeView (а не только ширинутекстовое поле).В сочетании со стилем Material Design это дает хорошие эффекты затенения, когда мышь наведена на определенный элемент дерева.
Есть только одна проблема.Хотя я могу получить ширину, чтобы принять полную ширину TreeViewItem, я не могу сделать то же самое для высоты.Это означает, что пользователь может щелкнуть рядом с краем элемента TreeView и увидеть все эффекты, как если бы этот элемент был нажат, но событие MouseDown
не срабатывает.
Это область, которая должен быть кликабельным (пунктирная красная линия):
![enter image description here](https://i.stack.imgur.com/dHYZi.png)
Это та область, которая фактически кликабельна (внешняя граница текстаBox):
![enter image description here](https://i.stack.imgur.com/NCkze.png)
Я пробовал несколько различных подходов, включая этот:
VerticalAlignment="Stretch"
и этот:
Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}, Path=ActualHeight}"
но они либо не действуют, либо неожиданно нарушают TreeView.Я думаю, что часть проблемы - обычная странная высота StackPanel, которая используется в ItemsPanelTemplate
.
Как я могу получить TextBox в каждом TreeViewItem, чтобы принять высоту фактического TreeViewItem?
Ниже приведено изображение соответствующей части визуального дерева, изTreeView вниз до интерактивного текстового поля.Элемент Ripple
является объектом MaterialDesignThemes.Wpf.Ripple
.
![enter image description here](https://i.stack.imgur.com/rT3xW.png)