水平调整大小时具有动态方向的 WPF Treeview
WPF Treeview with dynamic orientation when resizing horizontally
这是否可以从最初的角度来看:
页眉 1
- item1
- item2
- item3
标题 2
- item1
- item2
水平调整 window 时,项目也会从垂直调整为水平:
页眉 1
- item1 - item2
- item3
标题 2
- item1 - item2
后续项目根据 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
作为 TreeViewItem
的 ItemsPanel
。如果项目超过可用 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
之外的其他控件,但概念是相同的。
这是否可以从最初的角度来看:
页眉 1
- item1
- item2
- item3
标题 2
- item1
- item2
水平调整 window 时,项目也会从垂直调整为水平:
页眉 1
- item1 - item2
- item3
标题 2
- item1 - item2
后续项目根据 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
作为 TreeViewItem
的 ItemsPanel
。如果项目超过可用 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
之外的其他控件,但概念是相同的。