2017-02-22 32 views
2

Я не могу получить виртуализацию для работы на TreeView внутри Popup, тогда как тот же TreeView отлично работает вне Popup.UI Виртуализация внутри всплывающего окна

<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>(); 
    } 
} 

Когда я открываю родителя для дерева внутри окна не занимает времени, расширяя один внутри всплывающего окна занимает ~ 20s.

MS подтвердил, что это ошибка в 2010s, и предложил использовать ControlTemplate для объединения ToggleButton и TreeView в один элемент управления, но для меня это не имело никакого эффекта.

ответ

1

Фигурные это, все, что вам нужно сделать, это указать максимальную высоту (нормальная высота тоже работает) в Popup

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

Не совсем уверен, почему это помогает. Возможно, WPF нужно сделать слишком большой расчет размера, если он автоматически.