我想创建一个跟踪所选项目的菜单,所以我使用嵌套的 ListBoxes(因为 Selectors 的选项非常有限。主 ListBox 水平排列,每个 ListBoxItem 包含一个 TextBlock 和一个 StackPanel 以及另一个 ListBox(这个一个垂直显示)以显示“MenuItems”(我还需要跟踪所选项目)。像这样:
<ListBox DockPanel.Dock="Top" Grid.Column="0" ItemsSource="{Binding DashBoards}"
IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedDashBoard}">
<ListBox.Template>
<ControlTemplate TargetType="{x:Type ListBox}">
<DockPanel>
<ScrollViewer x:Name="scrollviewer" HorizontalScrollBarVisibility="Hidden" CanContentScroll="False">
<StackPanel IsItemsHost="True" Orientation="Horizontal" />
</ScrollViewer>
</DockPanel>
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name}" />
<dx:DXExpander IsExpanded="{Binding IsSelected}">
<ListBox ItemsSource="{Binding Sections}"
IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedSection}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Metadata.Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</dx:DXExpander>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我设法将这个 ListBox 显示在其他控件之上,所以它看起来像一个菜单。
现在有问题了……当我在水平列表框中选择一个项目时,扩展器可以正常展开,但列表框的高度会增加,因此所有其他项目看起来也像展开了一样。
如何在不更改 ListBox 高度的情况下仅扩展所选项目?
换句话说,我怎样才能让垂直列表框之一溢出其父容器(又名水平列表框)?
我想我需要重新构建一切,但我不知道如何开始。我找到了一些使用 Canvas 的解决方案,但在这种情况下它们似乎不起作用。
欢迎任何帮助,并将努力支持 ;-)
(注意:以防之前不清楚,我需要知道在水平 ListBox 中选择了哪个元素,以及在每个单独的垂直 ListBox 中选择了哪个元素。这将绑定到跟踪选择的相应 ViewModel,并且两者水平和垂直列表框是动态填充的,因此无法在 XAML 中定义它们)