我有ListView
使用WrapPanel
作为ItemsPanel
,我直接使用ListViewItem
作为内容。但当一个ListViewItem.Visibility
为Collapsed
时,您仍然可以看到它正在使用的空间。
首先,示例XAML代码与我使用的类似:
<Grid>
<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Hidden" ItemContainerStyle="{DynamicResource ContainerStyle}">
<ListView.Resources>
<Style TargetType="{x:Type ListViewItem}" x:Key="ContainerStyle">
<Setter Property="Background" Value="Transparent" />
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.Resources>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel ItemHeight="200" ItemWidth="200"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListViewItem Margin="10" Visibility="Visible">
<Border Background="Red"/>
</ListViewItem>
<ListViewItem Margin="10" Visibility="Visible">
<Border Background="Blue"/>
</ListViewItem>
<ListViewItem Margin="10" Visibility="Visible">
<Border Background="Green"/>
</ListViewItem>
</ListView>
</Grid>
但是,如果我更改第一项以使其折叠如下
<ListViewItem Margin="10" Visibility="Collapsed">
<Border Background="Red"/>
</ListViewItem>
因此我不明白为什么会这样,Collapsed
似乎表现得像Hidden
。我正在将它直接应用于该项目,并且不知道还能做什么。
我尝试了不同的解决方案,最值得注意的是this one about binding to Visibility in the style和this one going more or less in the same direction,但没有成功,结果相同。
答案 0 :(得分:2)
接受的答案实际上并未提供解决方案,而是在其评论部分提供。
如果设置了ItemWidth,WrapPanel将为绑定到自身的所有项目保留ItemWidth,可见或不可见。
这里的解决方法不是在WrapPanel上设置ItemWidth,而是在ItemTemplate上设置Width。
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel MinWidth="96" />
</DataTemaplate>
</ItemsControl.ItemTemplate>
答案 1 :(得分:0)
我认为您看到的问题与即使崩溃,ListViewItem仍然是Item,WrapPanel将检测3个项目而不是2个事实有关。
答案 2 :(得分:0)
一个好的工作解决方案似乎凌驾于&#34;安排&#34; Panel的方法,在自定义面板中。
我正在这个伟大的课程AlignableWrapPanel(继承自Panel,而不是WrapPanel)的基础上工作,我通过替换它来实现它:
var child = children[i];
if (child == null) continue;
用这个:
var child = children[i];
if (child == null) continue;
if (child.Visibility == Visibility.Collapsed) continue;
方法为ArrangeOverride
,ArrangeLine
和MeasureOverride
。 ArrangeLine
有点不同,但if(child == null) continue;
的行很容易被发现;在那之后添加一个Collapsed。
该解决方案适用于任何