我有一个 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>

例如,当所有项目都可见(上面的代码)时,我有这个:
wpf - WrapPanel 中的 ListViewItem 折叠时占用空间-LMLPHP

但是,如果我更改第一个项目以使其折叠如下
<ListViewItem Margin="10" Visibility="Collapsed">
    <Border Background="Red"/>
</ListViewItem>

结果是这样的:
wpf - WrapPanel 中的 ListViewItem 折叠时占用空间-LMLPHP

我期望的是以下内容:
wpf - WrapPanel 中的 ListViewItem 折叠时占用空间-LMLPHP

因此,我不明白为什么它会这样, Collapsed 似乎表现得就像 Hidden 。我将它直接应用到项目上,不知道还有什么可做的。

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

最佳答案

接受的答案实际上没有提供解决方案,而是在其评论部分提供。

如果您设置 ItemWidth,WrapPanel 将为绑定(bind)到自身的所有项目保留 ItemWidth,无论是否可见。

此处的解决方法不是在 WrapPanel 上设置 ItemWidth,而是在 ItemTemplate 上设置 Width。

<ItemsControl.ItemsPanel>
   <ItemsPanelTemplate>
       <WrapPanel />
   </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

<ItemsControl.ItemTemplate>
   <DataTemplate>
       <StackPanel MinWidth="96" />
   </DataTemaplate>
</ItemsControl.ItemTemplate>

关于wpf - WrapPanel 中的 ListViewItem 折叠时占用空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40427259/

10-13 06:55