2012-03-30 12 views
0

Ich habe einige Xaml (WPF), die ich versuche, in Code neu zu erstellen. Ich glaube, ich bin in der Nähe, aber ich bin ein wenig Mühe mit ... hier ist mein XAML:Recreate Xaml in Code

<ListView Name="lbDevices" SelectionChanged="lbDevices_SelectionChanged" VerticalAlignment="Stretch" Grid.Row="1"> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Horizontal" Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" ScrollViewer.HorizontalScrollBarVisibility="Hidden"></WrapPanel> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
     <ListView.View> 
      <GridView> 
       <GridView.ColumnHeaderContainerStyle> 
        <Style> 
         <Setter Property="FrameworkElement.Visibility" Value="Collapsed" /> 
        </Style> 
       </GridView.ColumnHeaderContainerStyle> 
       <GridViewColumn> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <!-- This is a custom control --> 
          <l:HaDeviceDisplayer DataContext="{Binding .}" ></l:HaDeviceDisplayer> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 

Die oben gibt mir eine perfekte Darstellung von dem, was ich brauche. Es sieht wie folgt aus:

Hier mein Versuch ist es in Code erstellen:

  GridView gv = new GridView(); 
      gv.AllowsColumnReorder = false; 

      var hiddenStyle = new Style(); 
      gv.ColumnHeaderContainerStyle = hiddenStyle; 
      gv.ColumnHeaderContainerStyle.Setters.Add(new Setter(FrameworkElement.VisibilityProperty, Visibility.Collapsed)); 

      ItemsPanelTemplate panelTemplate = new ItemsPanelTemplate(); 
      var fact = new FrameworkElementFactory(typeof(WrapPanel)); 
      fact.SetValue(WrapPanel.OrientationProperty, Orientation.Horizontal); 
      fact.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden); 

      var binding = new Binding() { 
       RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(ScrollContentPresenter), 1), 
       Path = new PropertyPath("(FrameworkElement.ActualWidth)") 
      }; 
      fact.SetBinding(WrapPanel.WidthProperty, binding); 

      panelTemplate.VisualTree = fact; 
      lbDevices.ItemsPanel = panelTemplate; 

      GridViewColumn c1 = new GridViewColumn(); 
      c1.CellTemplate = (DataTemplate)FindResource("DeviceDisplayer"); 
      lbDevices.View = gv; 

Ein paar Noten. Anstatt zu versuchen, das DataTemplate genau so zu erstellen, wie ich es in Xaml hatte, steckte ich es in ein UserControl.Resources Tag im Xaml. Ich verwende dann die FindResource, um das CellTemplate festzulegen.

Also hier ist mein Problem. Wenn ich die oben tue, endet das Layout wie folgt aufzublicken:

Broken list

Beachten Sie den sehr kleine orangefarbene Punkt ... es gibt etwa ein Dutzend von ihnen, die nur sichtbar sind, weil ein Element der Auswahl hebt es mit einem orange Grenze. Aus dem gleichen Grund ist jeder Listeneintrag klein. Das Problem ist - wie mache ich es "normal" groß?

Antwort

0

Ich habe nie herausgefunden, warum mein Code nicht mit dem XAML übereinstimmt. Stattdessen verwendete ich XAML und erstellte dann einen Verweis auf die Ansicht, um sie später wiederzuverwenden.

0

Nicht die Antwort, die Sie suchen, aber ich würde ein ItemsControl mit einem WrapPanel als ItemPanelTemplate verwenden und einen ItemTemplateSelector verwenden, um jedes Element abhängig vom Typ zu stylen, anstatt Elemente manuell zu einem ListView hinzuzufügen. Sie könnten einfach ein WrapPanel verwenden, um das gleiche Aussehen zu erhalten, aber ich nehme an, Sie möchten, dass es flexibel ist.