2017-03-22 11 views
3

In einem Page Ich habe die folgenden TreeView. Wie kann ich die Objekte innerhalb der ItemsControl erhalten, um den Seitenrand zu umblättern anstatt zu scrollen? Die WrapPanel scheint nichts zu tun.WPF Wrap Artikel innerhalb `TreeView`

Beachten Sie, dies ist nicht das gleiche wie fragen, wie Blattelemente zu wickeln - ich brauche nicht ItemsControl s wickeln (es gibt nur eine), aber müssen die Dinge in die ItemsControl wickeln.

<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> 

... hier sind einige Typdefinitionen:

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

... und woanders in Ihrem Code (um die TreeView zu erhalten zu füllen):

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

Beachten Sie auch, dass ich eine Expander verwende, anstatt mit einer anderen hierarchischen Datenvorlage fortzufahren, da ich diese Ebene benötigen muss, um Elemente horizontal angeordnet zu haben und die Orientation der 0 zu ändernauf einer beliebigen Ebene innerhalb des Baums anders als die anderen Ebenen breaks UI virtualization for the entire tree when that layer is expanded. Daher haben alle VirtualizingStackPanel s im obigen Baum eine vertikale/Standardausrichtung und die horizontale Anordnung für die letzte Schicht stammt von Expander s.

So sieht das obige aus. „ALPHA“ ist ein TopLevelItem sind die Guids MidLevelItem s, und jedes Paar Hex ist ein individuelles LowLevelItem (die Sie bemerken werden, sind nicht Einwickeln aber weiter vorbei an der Kante):

Screenshot of the above code

+0

Bitte stellen Sie einige Beispieldaten zur Verfügung, die verwendet werden können, um Ihr Problem von Grund auf zu reproduzieren: https://stackoverflow.com/help/mcve – mm8

+0

@ mm8 Lassen Sie mich wissen, wenn der Screenshot, den ich gerade bearbeitet habe, hilft? –

+0

Es ist sicherlich nicht. Sie sollten Code-Snippets bereitstellen, die jeder einfach in Visual Studio einfügen und ausführen kann, um Ihr Problem zu reproduzieren. – mm8

Antwort

1

Sie müssen angeben, die Width des Expander, zB:

<Expander Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=TreeView}}"> 
... 

Sie können einen Konverter oder etwas verwenden, das von der linken Kante Seite von den ActualWidth der TreeView Offset subtrahiert.