2014-10-29 97 views
1

我有以下的ListView:的WinRT - ListView的項目不能填滿整個空間垂直

<ListView x:Name="sportList" Grid.Row="0" Grid.Column="0" SelectionChanged="sportList_SelectionChanged"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" />       
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" Margin="15,0,0,0" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

它產生以下列表視圖控件:

enter image description here

我想舒展listviewitems垂直,以便填充所有空的空間。 類似的東西,以這個(實現specifing的文本塊固定高度)

enter image description here

+1

如果你有很多需要滾動條的項目,你會如何處理? – 2014-10-30 01:19:42

+0

@ ChobosaurusSoftware它將有一個固定的物品清單 – 2014-10-30 11:19:41

回答

1

你要的ListViewItem結合Height(或MinHeight)到ListView的ActualHeight。當然,我們需要一個轉換到ActualHeight轉換爲相同的高度爲每個項目:

<ListView x:Name="sportList" Grid.Row="0" Grid.Column="0" 
      ScrollViewer.VerticalScrollBarVisibility="Disabled" 
      ScrollViewer.CanContentScroll="False" UseLayoutRounding="True"> 
    <ListView.Resource> 
     <local:AutoFillHeightConverter x:Key="hc"/> 
    </ListView.Resource> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     <Setter Property="MinHeight" Value="{Binding ActualHeight, 
       RelativeSource={RelativeSource AncestorType=ListView}, 
       Converter={StaticResource hc}, [email protected]}"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <TextBlock Text="{Binding}" Margin="15,0,0,0" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

請注意,您的要求意味着我們不需要垂直滾動條。所以我們最好禁用或隱藏它。同時將CanContentScroll設置爲false,並將UseLayoutRounding設置爲true以獲得更好(更精確設置的高度)渲染。

這裏是AutoFillHeightConverter類(即我們嵌入ListView的資源的情況下):

public class AutoFillHeightConverter : IValueConverter { 
    object IValueConverter.Convert(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture) 
    { 
     var p = parameter as string; 
     var win = Application.Current.Windows.Cast<Window>() 
          .First(w => w.Name == p.Split('@')[0]); 
     var lv = win.FindName(p.Split('@')[1]) as ListView; 
     var lvh = Convert.ToDouble(value);    
     return lv.Items.Count == 0 ? Binding.DoNothing : (lvh/lv.Items.Count); 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, 
         object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}  

備註綁定的ConverterParameter,我們把它設置爲一個字符串。該字符串包括由@分隔的2個部分。第一部分應該是Window的Name,第二部分應該是ListView的Name。我們需要這些名稱來訪問Convert方法內的ListView實例來轉換高度。

+0

我會在幾個小時內檢查它。 – 2014-10-30 11:20:57

+0

對不起@ King King,但是在嘗試編譯AutoFillHeightConverterClass時出現以下錯誤:'FrameApp.AutoFillHeightConverter'未實現接口成員'Windows.UI.Xaml.Data.IValueConverter.ConvertBack(object,System.Type,object,string ) ' 錯誤\t \t 2 'FrameApp.AutoFillHeightConverter' 不實現接口成員 'Windows.UI.Xaml.Data.IValueConverter.Convert(對象,System.Type的,對象,字符串)' 錯誤\t \t 3' IValueConverter.Convert '在顯式接口聲明不是接口的成員 錯誤'IValueConverter.ConvertBack'在顯式接口聲明.. – 2014-10-30 20:30:04

+1

@Duncan_McCloud再次我回答了一個Windows Phone問題,但不知道回合吧。但是這次可能很容易解決。這裏(在WinRT中)'Convert'和'ConvertBack'應該有'string'類型的第四個參數(不是'CultureInfo'),所以你可以嘗試進行改變,看它是否有效。 – 2014-10-30 20:35:30