WPF包装`TreeView`中的项目

时间:2017-03-22 13:22:52

标签: c# wpf xaml treeview wrapping

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个人(你注意到它不是包装但是继续经过边缘):

Screenshot of the above code

1 个答案:

答案 0 :(得分:1)

您需要指定Width的{​​{1}},例如:

Expander

您可能希望使用转换器或从<Expander Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=TreeView}}"> ... 的{​​{1}}中减去左边缘偏移的内容。