在Page
内,我有以下TreeView
。如何将ItemsControl
内的内容换行而不是滚动页面边缘? WrapPanel
似乎没有做任何事情。
注意这与询问如何包装叶子项目不同 - 我不需要包裹ItemsControl
s(只有一个),但需要将内容包装好ItemsControl
。
<TreeView
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
Name="Tree">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type viewModel:HighLevelItem}"
ItemsSource="{Binding MidLevelItems}">
<TextBlock
Text="{Binding HighLevelName}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate
DataType="{x:Type viewModel:MidLevelItem}">
<Expander>
<Expander.Header>
<TextBlock
Text="{Binding MidLevelName}"/>
</Expander.Header>
<Expander.Content>
<ItemsControl
ItemsSource="{Binding LowLevelItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel
Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding LowLevelName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Expander.Content>
</Expander>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
...这里有一些类型定义:
public class HighLevelItem
{
public MidLevelItem[] MidLevelItems { get; set; }
public string HighLevelName { get; set; }
}
public class MidLevelItem
{
public LowLevelItem[] LowLevelItems { get; set; }
public string MidLevelName { get; set; }
}
public class LowLevelItem
{
public string LowLevelName { get; set; }
}
...以及代码中的其他位置(要填充TreeView
):
Tree.Items = new[] { new HighLevelItem { HighLevelName = "ALPHA", MidLevelItems = Enumerable.Repeat(0, 1000).Select(_ => new MidLevelItem { MidLevelName = Guid.NewGuid().ToString(), LowLevelItems = Enumerable.Repeat(0, 1000).Select(__ => new LowLevelItem { LowLevelName = "ff" }).ToArray() }).ToArray() } };
另请注意,我使用Expander
而不是继续使用其他分层数据模板,因为我需要该图层来水平排列项目,并更改Orientation
VirtualizingStackPanel
在树中的任何层与其他层breaks UI virtualization for the entire tree when that layer is expanded不同。因此,上面树中的所有VirtualizingStackPanel
都有垂直/默认方向,最后一层的水平排列来自Expander
s。
以上是上面的内容。 &#34; ALPHA&#34;是TopLevelItem
,Guids是MidLevelItem
s,每个十六进制对是LowLevelItem
个人(你注意到它不是包装但是继续经过边缘):
答案 0 :(得分:1)
您需要指定Width
的{{1}},例如:
Expander
您可能希望使用转换器或从<Expander Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=TreeView}}">
...
的{{1}}中减去左边缘偏移的内容。