在添加/删除项目时动态调整 ListView 高度?
Dynamically adjust ListView height on adding / removing items?
我有一个 3 级嵌套 ListView 绑定到相同的 3 级嵌套 Collection。 MainItems 添加到第 3 级。
未修改,所有层都有滚动条。在添加项目时,我编辑了 ListViewItem 的 Containing Grid 以动态调整高度。
我已成功删除 3 级滚动条。但是,我也想删除 2nd Level,我似乎做不到。
当我尝试调整 第一层 ListViewItem 的高度时,第一层的 滚动条消失了 但高度是根本没有调整。
我想做的是只有在第一级上有滚动条并从那里滚动。
基本上是这样的:
这是我当前的代码:
<Grid x:Name="ParentGrid">
<ListView x:Name="Level1ListView"
ItemsSource="{Binding Path=Level1}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid x:Name="GridLevel1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ToolKit_Controls:LayoutTransformControl Grid.Column="0">
<ToolKit_Controls:LayoutTransformControl.Transform>
<RotateTransform x:Name="rotateTransform" Angle="270"/>
</ToolKit_Controls:LayoutTransformControl.Transform>
<TextBlock Text="{Binding Path=Level1NameString}" FontSize="32" HorizontalAlignment="Center" />
</ToolKit_Controls:LayoutTransformControl>
<ListView x:Name="Level2ListView"
ItemsSource="{Binding Path=Level2}"
Grid.Column="1"
>
<ListView.ItemTemplate>
<DataTemplate>
<Grid x:Name="GridLevel2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border BorderBrush="White" BorderThickness="1" Grid.Row="0"/>
<TextBlock Text='{Binding Path=Level2Name}' Foreground="Black" FontSize="18"
Grid.Row="0"/>
<Grid x:Name="GridLevel3" Width="300" Height="100" Grid.Row="1">
<ListView x:Name="ListView_Level3" IsSwipeEnabled="False"
ManipulationMode="None"
ItemsSource="{Binding Path=Level3DisplayCollection}"
Grid.Column="1">
<ListView.ItemContainerTransitions>
<TransitionCollection>
<EntranceThemeTransition IsStaggeringEnabled="False" />
</TransitionCollection>
</ListView.ItemContainerTransitions>
</ListView>
</Grid>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="1" ></WrapGrid>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
并添加了更改项目高度的重要代码:
var GridLevel1 = TypedAssociatedObject.GetAncestors().Where(a => a.Named("GridLevel1")).FirstOrDefault() as Grid;
//GridLevel1.Height = GridLevel1.ActualHeight + 50;
var GridLevel2 = TypedAssociatedObject.GetAncestors().Where(a => a.Named("GridLevel2")).FirstOrDefault() as Grid;
GridLevel2.Height = GridLevel2.ActualHeight + 50;
var GridLevel3 = TypedAssociatedObject.GetAncestors().Where(a => a.Named("GridLevel3")).FirstOrDefault() as Grid;
GridLevel3.Height = GridLevel3.ActualHeight + 50;
Level 1 被注释掉了,因为当我添加它时,虽然 2nd Scroll Bar 被移除 ListViewItem 高度没有改变,导致 UI错了,没有显示一切。您还注意到第一级滚动条保持相同的大小:
我想要的是 扩展 Header 1 的高度,这样一切仍然显示 右边的第一级滚动条是扩展/增长的。
谁能帮忙指出我做错了什么?
谢谢!
编辑:这是一个 Windows 商店应用。
在您的内部列表视图中将 ItemsPanel
设置为 StackPanel
。这样您就不需要调整每个项目的高度。
还要隐藏滚动条使用 ScrollViewer.VerticalScrollBarVisibility="Hidden" on your inner list views.
您是否考虑过使用 grouping?
我有一个 3 级嵌套 ListView 绑定到相同的 3 级嵌套 Collection。 MainItems 添加到第 3 级。
未修改,所有层都有滚动条。在添加项目时,我编辑了 ListViewItem 的 Containing Grid 以动态调整高度。
我已成功删除 3 级滚动条。但是,我也想删除 2nd Level,我似乎做不到。
当我尝试调整 第一层 ListViewItem 的高度时,第一层的 滚动条消失了 但高度是根本没有调整。
我想做的是只有在第一级上有滚动条并从那里滚动。
基本上是这样的:
这是我当前的代码:
<Grid x:Name="ParentGrid">
<ListView x:Name="Level1ListView"
ItemsSource="{Binding Path=Level1}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid x:Name="GridLevel1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ToolKit_Controls:LayoutTransformControl Grid.Column="0">
<ToolKit_Controls:LayoutTransformControl.Transform>
<RotateTransform x:Name="rotateTransform" Angle="270"/>
</ToolKit_Controls:LayoutTransformControl.Transform>
<TextBlock Text="{Binding Path=Level1NameString}" FontSize="32" HorizontalAlignment="Center" />
</ToolKit_Controls:LayoutTransformControl>
<ListView x:Name="Level2ListView"
ItemsSource="{Binding Path=Level2}"
Grid.Column="1"
>
<ListView.ItemTemplate>
<DataTemplate>
<Grid x:Name="GridLevel2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border BorderBrush="White" BorderThickness="1" Grid.Row="0"/>
<TextBlock Text='{Binding Path=Level2Name}' Foreground="Black" FontSize="18"
Grid.Row="0"/>
<Grid x:Name="GridLevel3" Width="300" Height="100" Grid.Row="1">
<ListView x:Name="ListView_Level3" IsSwipeEnabled="False"
ManipulationMode="None"
ItemsSource="{Binding Path=Level3DisplayCollection}"
Grid.Column="1">
<ListView.ItemContainerTransitions>
<TransitionCollection>
<EntranceThemeTransition IsStaggeringEnabled="False" />
</TransitionCollection>
</ListView.ItemContainerTransitions>
</ListView>
</Grid>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="1" ></WrapGrid>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
并添加了更改项目高度的重要代码:
var GridLevel1 = TypedAssociatedObject.GetAncestors().Where(a => a.Named("GridLevel1")).FirstOrDefault() as Grid;
//GridLevel1.Height = GridLevel1.ActualHeight + 50;
var GridLevel2 = TypedAssociatedObject.GetAncestors().Where(a => a.Named("GridLevel2")).FirstOrDefault() as Grid;
GridLevel2.Height = GridLevel2.ActualHeight + 50;
var GridLevel3 = TypedAssociatedObject.GetAncestors().Where(a => a.Named("GridLevel3")).FirstOrDefault() as Grid;
GridLevel3.Height = GridLevel3.ActualHeight + 50;
Level 1 被注释掉了,因为当我添加它时,虽然 2nd Scroll Bar 被移除 ListViewItem 高度没有改变,导致 UI错了,没有显示一切。您还注意到第一级滚动条保持相同的大小:
我想要的是 扩展 Header 1 的高度,这样一切仍然显示 右边的第一级滚动条是扩展/增长的。
谁能帮忙指出我做错了什么?
谢谢!
编辑:这是一个 Windows 商店应用。
在您的内部列表视图中将 ItemsPanel
设置为 StackPanel
。这样您就不需要调整每个项目的高度。
还要隐藏滚动条使用 ScrollViewer.VerticalScrollBarVisibility="Hidden" on your inner list views.
您是否考虑过使用 grouping?