2012-03-30 66 views
0

我试图在代码中重新创建一些Xaml(WPF)。我觉得我很接近,但我有一个有点麻烦......这是我的XAML:以上在代码中重新创建Xaml

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

给我什么,我需要一个完美的显示效果。它看起来像这样:

这是我在代码重新创建它的尝试:

  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; 

有两点要注意。我没有像Xaml那样尝试重新创建DataTemplate,而是将它固定在Xaml的UserControl.Resources标记中。然后我使用FindResource来设置CellTemplate。

所以这是我的问题。当我做以上,布局最终看起来像这样:

Broken list

通知很小的橙色点......还有他们的大约有十几个是可见的,只是因为选择一个项目有它凸显橙色边框。出于同样的原因,每个列表项目都很小。麻烦的是 - 我如何使它“正常”大小?

回答

0

我从来没有弄清楚为什么我的代码与XAML不匹配。相反,我最终使用了XAML,然后创建了一个对View的引用,以便稍后重用。

0

不是你正在寻找的答案,但我会使用带有WrapPanel的ItemsControl作为ItemPanelTemplate,并使用ItemTemplateSelector根据类型对每个项目进行样式设置,而不是手动将项目添加到ListView。你可以使用WrapPanel来获得相同的外观,但我猜你希望它是灵活的。

相关问题