Windows应用商店应用中的ListView项目高度

时间:2012-11-29 10:53:41

标签: xaml windows-8 microsoft-metro

我有一个简单的ListView

<ListView ItemsSource="{Binding SelectedSearch.Offers}"
    IsItemClickEnabled="True"
    ItemClick="lv_ItemClick_1"
    Margin="0,0,0,10"
    Name="lv"                          
    SelectionMode="None"
    IsSwipeEnabled="false"
    ItemTemplateSelector="{StaticResource OffersGridTemplateSelector}"/>

我自定义ItemTemplate选择器用于在两个不同的DataTemplates之间进行选择。问题是,每个项目似乎都有最小高度。

如果我只使用带有TextBlock的DataTemplate

    <DataTemplate x:Key="SpecialTextTemplate">
        <TextBlock Text="{Binding Text}" />
    </DataTemplate>

该项目占用太多空间。它似乎占用与堆栈面板中由3个文本块组成的其他模板相同的最小空间

如何让它缩小到内容的高度?是否有最小高度?

5 个答案:

答案 0 :(得分:3)

最近我在UWP应用程序中也遇到了同样的问题。是的,为列表视图项定义了默认最小高度。压倒同样会解决问题。对我来说这个解决方案有效:

<Style x:Key="NoSpacesListViewItemStyle" TargetType="ListViewItem">
   <Setter Property="MinHeight" Value="YOUR_MIN_HEIGHT" />
</Style>

答案 1 :(得分:1)

我已经为这个问题找到了相当清晰的解决方案!

<Style x:Key="NoSpacesListViewItemStyle" TargetType="ListViewItem">
    <Setter Property="Margin" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <ListViewItemPresenter ContentMargin="0" SelectionCheckMarkVisualEnabled="False" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<ListView     IsSwipeEnabled="False"
              ItemContainerStyle="{StaticResource NoSpacesListViewItemStyle}"
              ItemTemplate="{StaticResource SomeTemplate}"
              ItemsSource="{Binding SomeData}"
              SelectionMode="None"/>

此外,我可以承认,选择边框在这种情况下不起作用。因此,此方法不适用于具有选择的ListView。

完整的默认ListViewItemStyle具有相同的更改:

<Style x:Key="NoSpacesListViewItemStyle" TargetType="ListViewItem">
    <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
    <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="TabNavigation" Value="Local" />
    <Setter Property="IsHoldingEnabled" Value="True" />
    <Setter Property="Margin" Value="0" />
    <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="VerticalContentAlignment" Value="Top" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <ListViewItemPresenter HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                                       VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                                       CheckBrush="{ThemeResource ListViewItemCheckThemeBrush}"
                                       CheckHintBrush="{ThemeResource ListViewItemCheckHintThemeBrush}"
                                       CheckSelectingBrush="{ThemeResource ListViewItemCheckSelectingThemeBrush}"
                                       ContentMargin="0"
                                       ContentTransitions="{TemplateBinding ContentTransitions}"
                                       DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}"
                                       DragBackground="{ThemeResource ListViewItemDragBackgroundThemeBrush}"
                                       DragForeground="{ThemeResource ListViewItemDragForegroundThemeBrush}"
                                       DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}"
                                       FocusBorderBrush="{ThemeResource ListViewItemFocusBorderThemeBrush}"
                                       Padding="{TemplateBinding Padding}"
                                       PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}"
                                       PointerOverBackground="{ThemeResource ListViewItemPointerOverBackgroundThemeBrush}"
                                       PointerOverBackgroundMargin="1"
                                       ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                                       SelectedBackground="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}"
                                       SelectedBorderThickness="{ThemeResource ListViewItemCompactSelectedBorderThemeThickness}"
                                       SelectedForeground="{ThemeResource ListViewItemSelectedForegroundThemeBrush}"
                                       SelectedPointerOverBackground="{ThemeResource ListViewItemSelectedPointerOverBackgroundThemeBrush}"
                                       SelectedPointerOverBorderBrush="{ThemeResource ListViewItemSelectedPointerOverBorderThemeBrush}"
                                       SelectionCheckMarkVisualEnabled="False" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

答案 2 :(得分:1)

答案并不明显。 ListViewItem默认模板有一个装饰所选项目的复选框。此复选框显示在所选项目的右上角,高度和宽度均为40,这有效地为您提供了这些项目的最小高度。您可以通过设置:

来禁用该复选框
       SelectionCheckMarkVisualEnabled="False"

在您复制的模板中。

答案 3 :(得分:0)

默认情况下,ItemTemplates没有最小高度。 我创建了一个非常简单的示例,它有一个列表视图,2个模板和一个模板选择器,但没有重现您的问题。让我知道它是否适合你。

XAML:

<ListView ItemsSource="{Binding Items}" ItemTemplateSelector="{StaticResource ts}">
            <ListView.Resources>
                <DataTemplate x:Key="t1">
                    <TextBlock Text="aaa"/>
                </DataTemplate>

                <DataTemplate x:Key="t2">
                    <TextBlock Text="bbb" Foreground="Red" Height="100"/>
                </DataTemplate>

                <local:TestTemplateSelector x:Key="ts" T1 ="{StaticResource t1}" T2="{StaticResource t2}"/>
            </ListView.Resources>
        </ListView>

选择器:(应该位于xaml中定义为“local”的命名空间中

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace *TestBinding*
{
    public class TestTemplateSelector : DataTemplateSelector
    {
        public DataTemplate T1 { get; set; }
        public DataTemplate T2 { get; set; }

        protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container)
        {
            if (item.ToString() == "b")
            {
                return T2;
            }

            return T1;
        }
    }

ViewModel:

public IList<string> Items { get { return new List<string>() { "a", "b", "c" }; } }

答案 4 :(得分:0)

老问题,我知道,但我遇到了同样的问题。在我寻找解决方案时,我发现了这个问题:Different item size in a grouped gridView。 没有尝试过解决方案,但似乎你需要一个VariableSizedWrapGrid。