Wpf Winrt-ListView项目不';不要垂直填充所有空间

Wpf Winrt-ListView项目不';不要垂直填充所有空间,wpf,listview,windows-runtime,winrt-xaml,listviewitem,Wpf,Listview,Windows Runtime,Winrt Xaml,Listviewitem,我有以下列表视图: <ListView x:Name="sportList" Grid.Row="0" Grid.Column="0" SelectionChanged="sportList_SelectionChanged"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="Hori

我有以下列表视图:

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

它生成以下Listview控件:

我想垂直拉伸listviewitems,以便填充所有的空白。 类似于此(通过指定文本块的固定高度实现)


您必须将
列表视图项的
高度(或
最小高度
)绑定到列表视图的
实际高度。当然,我们需要一个转换器将
实际高度
转换为每个项目的相同高度:

<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}, ConverterParameter=win@sportList}"/>
      </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding}" Margin="15,0,0,0" />
      </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

请注意,关于绑定的
ConverterParameter
,我们将其设置为字符串。此字符串包括两个部分,由
@
分隔。第一部分应该是窗口的
名称
,第二部分应该是列表视图的
名称
。我们需要这些名称来访问
Convert
方法中的ListView实例,以转换高度。

如果您有许多项目需要滚动条,您将如何处理?ChubosaurusSoftware它将有一个固定的项目列表。我将在几个小时内检查它。对不起@King King,但我在尝试编译AutoFillHeightConverterClass时遇到以下错误:“FrameApp.AutoFillHeightConverter”未实现接口成员“Windows.UI.Xaml.Data.IValueConverter.ConvertBack(对象、系统、类型、对象、字符串)”“错误2'FrameApp.AutoFillHeightConverter'未实现接口成员”Windows.UI.Xaml.Data.IValueConverter.Convert(对象、系统类型、对象、字符串)显式接口声明中的'Error 3'IValueConverter.Convert'不是接口错误4'IValueConverter.ConvertBack'的成员。@Duncan_McCloud我再次回答了一个Windows Phone问题,但不知道它。不过,这一次可能很容易修复。这里(WinRT中)的
Convert
ConvertBack
应该有类型为
string
(而不是
CultureInfo
)的第四个参数,所以您可以尝试进行更改,看看是否有效。我自己修复了这一问题,但编译器仍然无法解析“Binding.DoNothing”和Application.Current.Windows。这可能是因为它是一个Window Store(W8)应用程序,而不是Windows Phone应用程序?@Duncan_McCloud是的,可能是这样,对不起。我从未为Windows Phone编程。但是解决你的问题的想法是一样的。您可以尝试搜索有关如何在Windows Phone中实现转换器的详细信息<代码>绑定。此处不执行任何操作仅意味着不执行任何操作,但如果Windows phone中不存在该操作,则可以尝试使用
0
(这并不重要,因为没有任何项目)。我不知道如何修复缺少的
Application.Current.Windows
,所以看起来你必须自己搜索更多。
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();
    }
}