2012-03-30 73 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來獲得相同的外觀,但我猜你希望它是靈活的。

相關問題