我有一个简单的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个文本块组成的其他模板相同的最小空间
如何让它缩小到内容的高度?是否有最小高度?
答案 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。