【发布时间】:2012-02-08 10:40:18
【问题描述】:
我在 wpf 中有一个 ListView,用于显示字段列表;基于属性值,某些字段可以在运行时折叠。它工作正常,除了 ListVIew 不会折叠为 ListViewItem 保留的空间,该空间在运行时折叠。
我可以在 Snoop 中看到额外的 ListViewItems(具有折叠的可见性),ListView 也会向上移动项目,但它不会调整其高度以删除空白空间!
我可以肯定地说这是由于VirtualizedStackPanel 而发生的,因为将 ItemsPanel 更改为 StackPanel 可以解决问题。这是相关的ListView XAML:
<ListView
x:Class="Wizards.FieldBinderModelListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Margin="0"
VerticalAlignment="Top"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Top"
Background="White"
BorderThickness="0"
Grid.IsSharedSizeScope="True"
KeyboardNavigation.DirectionalNavigation="Continue"
Padding="1"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
SelectionChanged="ListViewSelectionChanged"
SelectionMode="Single">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<!--Works fine with StackPanel but not with VirtualizingStackPanel
Explicitly added this PanelTemplate to show that it works with
StackPanel;ListView uses VirtualizingStackPanel as default panel
and causes same problem-->
<!--<StackPanel Orientation="Vertical" VerticalAlignment="Top"/>-->
<VirtualizingStackPanel Orientation="Vertical"
VerticalAlignment="Top"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="Black" />
</Trigger>
<DataTrigger Binding="{Binding Status}"
Value="{x:Static local:Status.NotExisting}">
<!--Hide the fields which are in NotExisting state;
Need a trigger here as Status can be different -->
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type View:FieldViewModel}">
<local:FieldEditor
Margin="0,2,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Top"
Padding="0">
<!--<local:FieldEditor.Style>
<Style TargetType="{x:Type local:FieldEditor}">
<Style.Triggers>
<DataTrigger
Binding="{Binding Status}"
Value="{x:Static local:Status.NotExisting}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</local:FieldEditor.Style>-->
</local:FieldEditor>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这是VirtualizingStackPanel 中的错误吗?还有其他人遇到过类似的问题吗?有什么解决方法吗?
更新:
在连接时将此错误报告给 MS - https://connect.microsoft.com/VisualStudio/feedback/details/734113/virtualizingstackpanel-not-handling-collapsed-items-correctly
【问题讨论】:
-
请将代码贴在折叠部分项目的位置。为什么要在虚拟化列表中隐藏垂直滚动条?
-
感谢 BalamBalam,我已经用相关的 xaml 更新了帖子;滚动条被隐藏,因为此列表视图被添加到将处理滚动的父 ListView 中,此 ListView 的多个实例和其他控件可以存在于父列表视图中;尽管启用它们并不会改变这种行为。
-
There's more to virtualizing a control than using a
VirtualizingStackPanel,但我认为 ListViews 默认是虚拟化的。 -
我会查看上面来自@Rachel 的链接。如果您不打算在单个 ListView 上启用 VerticalScroll 栏,那么我认为您将打破虚拟化,因为单个 ListView 认为它有足够的空间容纳所有项目,并且只要它知道它在屏幕上的所有项目。我真的怀疑 ListView 能否有效地虚拟化整个 ListView。如果视觉 UI 不受约束,ListView 将无法虚拟化。
-
好的;假设我启用了滚动,这会解决我面临的问题吗......?不,我试过了,不管滚动条是否启用/禁用,空白空间仍然存在。
标签: .net wpf listview .net-4.0 virtualizingstackpanel