水平调整大小时具有动态方向的 WPF Treeview

WPF Treeview with dynamic orientation when resizing horizontally

这是否可以从最初的角度来看:

页眉 1

标题 2

水平调整 window 时,项目也会从垂直调整为水平:

页眉 1

标题 2

后续项目根据 window 大小移动到下一个水平位置。也就是说,如果在全屏模式下,项目都是水平排列的,任何多余的项目都会在下一行。
示例:
标头 3
-item1 -item2 -item3 -item4 ...
-item11 -item12 -item13

如果可以,请问如何实现?谢谢!

从你的描述来看,我猜想你想要显示分层数据,所以我使用带有静态项目的 TreeView 来演示它是如何实现的,但它对动态数据同样有效。

<TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
   <TreeView.ItemContainerStyle>
      <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
         <Setter Property="ItemsPanel">
            <Setter.Value>
               <ItemsPanelTemplate>
                  <WrapPanel/>
               </ItemsPanelTemplate>
            </Setter.Value>
         </Setter>
      </Style>
   </TreeView.ItemContainerStyle>
   <TreeViewItem Header="Header 1">
      <TreeViewItem Header="Item 1"/>
      <TreeViewItem Header="Item 2"/>
      <TreeViewItem Header="Item 3"/>
   </TreeViewItem>
   <TreeViewItem Header="Header 2">
      <TreeViewItem Header="Item 1"/>
      <TreeViewItem Header="Item 2"/>
   </TreeViewItem>
</TreeView>

完成这项工作的关键是使用 WrapPanel 作为 TreeViewItemItemsPanel。如果项目超过可用 space.

,则换行面板会将项目放在下一行

Positions child elements in sequential position from left to right, breaking content to the next line at the edge of the containing box.

ItemContainerTemplate 会将此面板应用于所有 TreeViewItem。禁用水平滚动是必要的,因为否则项目将根据需要提供尽可能多的 space(用正无穷大测量),因此项目不会换行。我没有将 WrapPanel 分配给 TreeView 本身,因为那样也会包装 headers。

当然,您可以使用除 TreeView 之外的其他控件,但概念是相同的。