2012-03-30 4 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を使用して終了し、後で再利用するためにビューへの参照を作成するだけでした。

0

答えはありませんが、WrapPanelをItemPanelTemplateとして使用してItemsControlを使用し、ItemTemplateSelectorを使用して、アイテムをListViewに手動で追加するのではなくタイプに応じてスタイルを設定します。あなたはWrapPanelを使って同じ見た目を得ることができますが、私はそれを柔軟にしたいと思っています。

関連する問題