2013-02-16 53 views
4

我可以在基本(非GridView)模式下輕鬆「隱式」設計ListView,但是我嘗試在GridView模式下隱式設置ListView的方式失敗了。下面的作品是因爲我明確地設置了第二個ListView的Style和ItemContainerStyle。如果你刪除了這兩個設置,第二個ListView並不像第一個那樣被隱式地設計。看起來基本的ListView需要一個ContentPresenter,而一個GridView ListView需要一個GridViewRowPresenter。是否可以在GridView模式下隱式設置WPF ListView?

我在這裏跑到一個WPF磚牆嗎?這甚至有可能嗎?如果沒有,它會使創建應用程序皮膚的穩健性下降,因爲現在用戶必須知道在GridView模式下顯示的ListView上顯式設置Style和ItemContainerStyle。

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:system="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style TargetType="ListView"> 
      <Setter Property="Background" Value="Lime"/> 
     </Style> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="Background" Value="Yellow"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Grid> 
         <ContentPresenter x:Name="ContentHost" Margin="{TemplateBinding Padding}" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
        </Grid> 
       </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style x:Key="{x:Static GridView.GridViewStyleKey}" 
       TargetType="{x:Type ListView}"> 
      <Setter Property="Background" Value="Lime"/> 
     </Style> 
     <Style x:Key="{x:Static GridView.GridViewItemContainerStyleKey}" 
       TargetType="{x:Type ListViewItem}"> 
      <Setter Property="Background" Value="Yellow"/> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <ListView x:Name="_listView1"> 
      <system:String>Item 1</system:String> 
      <system:String>Item 2</system:String> 
      <system:String>Item 3</system:String> 
     </ListView> 

     <ListView x:Name="_listView2" Grid.Column="1" 
        Style="{StaticResource {x:Static GridView.GridViewStyleKey}}" 
        ItemContainerStyle="{StaticResource {x:Static GridView.GridViewItemContainerStyleKey}}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Date"/> 
        <GridViewColumn Header="Day of Week" DisplayMemberBinding="{Binding DayOfWeek}" /> 
        <GridViewColumn Header="Year" DisplayMemberBinding="{Binding Year}" /> 
       </GridView> 
      </ListView.View> 
      <system:DateTime>1/1/2010</system:DateTime> 
      <system:DateTime>1/1/2011</system:DateTime> 
      <system:DateTime>1/1/2012</system:DateTime> 
     </ListView> 
    </Grid> 
</Window> 
+0

這可能是一個有點晚來,但我試圖回答另一個問題時,發現可能是有益的一種變通方法:http://stackoverflow.com/questions/18700352/listviewitem -override-default-style-break-gridviews/18775166#18775166 – Chris 2013-09-12 22:16:08

+0

將其轉換爲答案,我會將其標記爲這樣。謝謝! – 2013-09-13 01:05:47

+0

完成,很高興它很有用! – Chris 2013-09-13 10:24:36

回答

4

我遇到同樣的奇/棘手的問題,因爲你上面描述,跑進一個博客貼子,提出了一個整潔的小黑客/修復,這似乎提供你以後的行爲。如果鏈接消失,重複要點。

您已經描述了ListView樣式的奇怪要求,如果您要覆蓋視圖並使用GridViews;基本的ListView需要ContentPresenterGridView ListView needsGridViewRowPresenter

海報設法通過包括他的風格中同時主持人,並使用Setter顯示僅在需要時將ContentPresenter來解決這個問題。

所以你ControlTemplate可以實施這些方針的東西(你的額外樣式屬性根據需要添加):

<ControlTemplate TargetType="{x:Type ListBoxItem}"> 
    <!-- Pair of presenters --> 
    <Grid> 
     <GridViewRowPresenter x:Name="gridrowPresenter" 
       Content="{TemplateBinding Property=ContentControl.Content}"/> 
     <ContentPresenter x:Name="contentPresenter" 
       Content="{TemplateBinding Property=ContentControl.Content}" Visibility="Collapsed"/> 
    </Grid> 
    <!-- Visibility Controlling Setter --> 
    <ControlTemplate.Triggers> 
     <Trigger Property="GridView.ColumnCollection" Value="{x:Null}"> 
      <Setter TargetName="contentPresenter" Property="Visibility" Value="Visible"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

兩個GridViewRowPresenterContentPresenter存在於風格,但ContentPresenter是隱藏的(Visibility="Collapsed")。

巧妙的技巧是使用TriggerGridView.ColumnCollection;如果此值爲空(當GridViewRowPresenter沒有內容時發生),則ContentPresenter將變爲可見,正確顯示正常ListView內容)。 GridViewRowPresenter將沒有內容,所以它不會顯示任何衝突的視覺效果。

如果GridView包含內容,它將顯示(提供正確的行格式),並且ContentPresenter將保持隱藏狀態。

原始博客條目:http://www.steelyeyedview.com/2010/03/contentpresenter-gridviewrowpresenter.html

相關問題