折叠时WrapPanel中的ListViewItem占用空间

时间:2016-11-04 16:12:41

标签: wpf xaml c#-4.0 wrappanel

我有ListView使用WrapPanel作为ItemsPanel,我直接使用ListViewItem作为内容。但当一个ListViewItem.VisibilityCollapsed时,您仍然可以看到它正在使用的空间。

首先,示例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>

例如,当所有项目都可见时(上面的代码)我有这个: All items are visible

但是,如果我更改第一项以使其折叠如下

<ListViewItem Margin="10" Visibility="Collapsed">
    <Border Background="Red"/>
</ListViewItem>

结果是这样的: First item is not visible but uses space

我期望的是以下内容: Expected result of collapsing

因此我不明白为什么会这样,Collapsed似乎表现得像Hidden。我正在将它直接应用于该项目,并且不知道还能做什么。

我尝试了不同的解决方案,最值得注意的是this one about binding to Visibility in the stylethis one going more or less in the same direction,但没有成功,结果相同。

3 个答案:

答案 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;

方法为ArrangeOverrideArrangeLineMeasureOverrideArrangeLine有点不同,但if(child == null) continue;的行很容易被发现;在那之后添加一个Collapsed。

该解决方案适用于任何