2

我有一个简单的 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 选择器用于在两个不同的 DataTemplate 之间进行选择。问题是,每个项目似乎都有一个最小高度。

如果我只使用带有 TextBlock 的 DataTemplate

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

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

如何使其缩小到内容的高度?有最低高度吗?

4

5 回答 5

3

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

<Style x:Key="NoSpacesListViewItemStyle" TargetType="ListViewItem">
   <Setter Property="MinHeight" Value="YOUR_MIN_HEIGHT" />
</Style>
于 2016-02-25T16:08:13.637 回答
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"/>

我也可以承认选择边框在这种情况下不起作用。所以这个方法不适合有选择的ListViews。

有完整的默认 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>
于 2014-09-22T20:58:24.050 回答
1

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

       SelectionCheckMarkVisualEnabled="False"

在您复制的模板中。

于 2014-11-06T23:02:45.760 回答
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 中定义为“本地”的命名空间中

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

视图模型:

public IList<string> Items { get { return new List<string>() { "a", "b", "c" }; } }
于 2012-12-01T05:03:43.250 回答
0

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

于 2013-05-14T11:33:01.973 回答