2013-02-10 17 views
8

Ich habe zwei DataTemplates innerhalb meines XAML definiert, die jeweils für ein separates ItemsControl Panel verwendet werden.Horizontal orientiertes WrapPanel in ItemsControl Listen vertikal

Das Haupt-ItemsControl listet Foo-Objekte auf, die in einem ObservableCollection-Objekt gespeichert sind.

Das Foo-Objekt selbst verfügt über einen eigenen Satz von Elementen, die in einem ObservableCollection-Objekt gespeichert sind.

Ich habe versucht, die XAML in einer Weise zu definieren, die für jede der ObservableCollection Foo Elemente mit seinem Namen in einer Kopfzeile angezeigt werden kann (The First ItemsControl). Daraus sollte die Liste innerhalb jedes Foo-Elements selbst horizontal angezeigt werden (unter Verwendung des zweiten ItemsControl) mit einem verwandten Feld direkt darunter. Wenn genügend Elemente vorhanden sind, sollten sie bei Bedarf zur nächsten Zeile wechseln. Diese

ist, wie die UI derzeit steht:

Incorrect UI

Dies ist, wie ich die UI wollen tatsächlich erscheinen:

Correct UI

Meine Markup (Button-Steuerelemente sind für einen anderen Aspekt der Benutzeroberfläche):

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 
     <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
      <ItemsControl x:Name="ContentList" ItemTemplate="{StaticResource GameTemplate}" Grid.Column="0" /> 
     </ScrollViewer> 
     <StackPanel Grid.Column="1" Background="DarkGray"> 
      <Button Click="OnLoad">_Load</Button> 
      <Button Click="OnSave">_Save</Button> 
      <Button Click="OnAdd">_Add</Button> 
      <Button Click="OnDelete">_Delete</Button> 
     </StackPanel> 
    </Grid> 

Datatemplate für die Auflistung Foo Artikel:

<DataTemplate x:Key="GameTemplate"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="30" /> 
        <RowDefinition Height="*" /> 
       </Grid.RowDefinitions> 
       <Label Content="{Binding Name}" Grid.Row="0" Background="Gray" FontSize="16" /> 
       <ItemsControl x:Name="imageContent" 
           ItemsSource="{Binding FileList}" 
           ItemTemplate="{StaticResource GameImagesTemplate}" 
           Grid.Row="1" /> 
      </Grid> 
     </DataTemplate> 

Datatemplate für Elemente innerhalb jeder Foo Artikel Listing:

<DataTemplate x:Key="GameImagesTemplate"> 
      <WrapPanel Orientation="Horizontal"> 
       <StackPanel Orientation="Vertical" > 
        <Image Source="{Binding FileInfo.FullName}" 
         Margin="8,8,8,8" 
         Height="70" 
         Width="70" /> 
        <Label Content="{Binding Name}" /> 
       </StackPanel> 
      </WrapPanel> 
     </DataTemplate> 

Ich bin ziemlich neu in WPF, so habe ich das Gefühl, es ein Problem ist, verursacht durch, wie ich bin Verwenden der Steuerelemente.

Welche WPF-Änderungen müsste ich vornehmen, um die UI zu generieren, die ich möchte?

+0

Es gibt nichts, das mit Ihrem XAML als falsch herausspringt. Können Sie angeben, wie Sie die Daten auffüllen? –

+0

Eine Beispielimplementierung des vertikalen und horizontalen Scrollens für ItemsControl-Artikel wird angezeigt: http://www.technical-recipes.com/2017/how-to-orient-wrappanel-items-within-itcontrol-lists-vertically-and- horizontal/ – AndyUK

Antwort

17

Ich denke sein, weil Sie jedes Bild Element an einen neuen WrapPanel in GameImagesTemplate hinzufügen, sollten Sie nur die ItemsControlItemsPanelTemplate-WrapPanel im GameTemplate

Beispiel einstellen:

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="252.351" Width="403.213" Name="UI" > 
    <Window.Resources> 

     <DataTemplate x:Key="GameImagesTemplate" > 
      <StackPanel> 
       <Image Source="{Binding FileInfo.FullName}" Margin="8,8,8,8" Height="70" Width="70" /> 
       <Label Content="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 

     <DataTemplate x:Key="GameTemplate"> 
      <StackPanel> 
       <Label Content="{Binding Name}" Grid.Row="0" Background="Gray" FontSize="16" /> 
       <ItemsControl x:Name="imageContent" ItemsSource="{Binding FileList}" ItemTemplate="{StaticResource GameImagesTemplate}" > 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <WrapPanel Orientation="Horizontal" ScrollViewer.HorizontalScrollBarVisibility="Disabled" /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 
      </StackPanel> 
     </DataTemplate> 
    </Window.Resources> 

    <Grid> 
     <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> 
      <ItemsControl ItemsSource="{Binding ElementName=UI, Path=FileList}" Grid.Column="0" ItemTemplate="{StaticResource GameTemplate}" /> 
     </ScrollViewer> 
    </Grid> 
</Window> 

Code:

public partial class MainWindow : Window 
{ 
    private ObservableCollection<Foo> _fileList = new ObservableCollection<Foo>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     foreach (var item in Directory.GetDirectories(@"C:\StackOverflow")) 
     { 
      FileList.Add(new Foo 
      { 
       Name = item, 
       FileList = new ObservableCollection<Bar>(Directory.GetFiles(item).Select(x => new Bar { FileInfo = new FileInfo(x) })) 
      }); 
     } 
    } 

    public ObservableCollection<Foo> FileList 
    { 
     get { return _fileList; } 
     set { _fileList = value; } 
    } 
} 

public class Foo 
{ 
    public string Name { get; set; } 
    public ObservableCollection<Bar> FileList { get; set; } 
} 

public class Bar 
{ 
    public FileInfo FileInfo { get; set; } 
} 

Ergebnis

enter image description here

+0

Ah, ich sehe genau wo ich falsch gelaufen bin. Danke für die ausführliche Antwort - +1 und ein Akzeptieren für Sie! –

Verwandte Themen