2

我无法让虚拟化在TreeView内部工作,PopupTreeViewPopup.

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <ToggleButton IsChecked="{Binding ElementName=Popup, Path=IsOpen, Mode=TwoWay}"
                      Content="Test"/>

        <TreeView Grid.Row="1" ItemsSource="{Binding Nodes}" VirtualizingPanel.IsVirtualizing="True">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <TextBlock Text="{Binding Data}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

        <Popup x:Name="Popup" StaysOpen="True">
            <TreeView ItemsSource="{Binding Nodes}" VirtualizingPanel.IsVirtualizing="True">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <TextBlock Text="{Binding Data}"/>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </Popup>
    </Grid>

ViewModel 和 Node 类

public class ViewModel
{
    public ObservableCollection<Node> Nodes { get; private set; }
    public ViewModel()
    {
        Nodes = new ObservableCollection<Node>();
        Node parent = new Node("Parent");

        for (int i = 0; i < 10000; i++)
            parent.Children.Add(new Node(i.ToString()));

        Nodes.Add(parent);
    }
}
public class Node
{
    public string Data { get; set; }

    public List<Node> Children { get; set; }
    public Node(string data)
    {
        Data = data;
        Children = new List<Node>();
    }
}

当我在窗口内展开树的父级时,它不需要时间,而在弹出窗口内展开一个需要大约 20 秒。

MS 确认这是2010 年代的一个错误,并建议使用 ControlTemplate 将 ToggleButton 和 TreeView 合并到一个控件中,但它对我没有任何影响。

4

1 回答 1

1

想通了,您需要做的就是为 Popup 指定一个最大高度(正常高度也可以)

<Popup x:Name="Popup" StaysOpen="True" MaxHeight="500">

不太确定为什么这会有所帮助。如果 WPF 是自动的,也许 WPF 需要做太多的大小计算。

于 2017-02-22T21:05:20.567 回答