尝试在 UWP 中隐藏选定项时如何删除列表视图的占位符?

How to remove the placeholder for listview when try to hide selecteditem in UWP?

我正在尝试为我的 UWP 应用程序实现撤消功能,该应用程序具有可以滑动以执行操作的列表视图(例如向左滑动删除,向右滑动存档)。我的 xaml 滑动列表视图的摘要是这样的

<controls:SwipeListView.ItemTemplate>
    <DataTemplate>
        <Grid Visibility="{Binding HideForUndo, Converter={StaticResource BooleanNegationToVisibilityConverter}}">
            SomeContents here...
        </Grid>
    </DataTemplate>
</controls:SwipeListView.ItemTemplate>

而容器样式是这样的

<controls:SwipeListView.ItemContainerStyle>
    <Style TargetType="controls:SwipeListViewItem">
        <Setter Property="TabNavigation" Value="Local"/>
        <Setter Property="IsHoldingEnabled" Value="True"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Top"/>
        <Setter Property="Padding" Value="0,0,0,0"/>
        <Setter Property="MinHeight" Value="0"/>
    </Style>
</controls:SwipeListView.ItemContainerStyle>

问题是我隐藏选中项后,选中项上方和下方的项之间会有一些space。只有当撤消计时器到期并删除所选项目时,space 才会消失。我可以看到所选项目已折叠,其下方的项目确实向上移动,但只有一些 space。

我发现了一个与我相似的问题: 然而,即使我将 MinHeight 和 Padding 设置为 [=14=,它似乎对我不起作用].


编辑: 经过测试,我发现这与 ListView 无关,而是与 SwipeListView.
有关

SwipeListView添加了很多其他控件,只有突出显示的部分会设置为折叠,其他部分仍然可见。

我不知道你是如何实现"HideForUndo"功能的细节。但是如果你能拿到选中的item,我觉得你可以试试用ItemsControl.ContainerFromItem method to get the item container which in SwipeListView就是SwipeListViewItem。有了SwipeListViewItem后,你可以设置SwipeListViewItem.VisibilityVisibility.Collapsed来隐藏整个项目。

来自SwipeListView class, we can find it is derived from ListView class and ListView inherits from ItemsControl的源代码,所以我们可以使用ItemsControl.ContainerFromItem方法和SwipeListView

这里以Demo in SwipeListView为例:

private void SwipeListView_ItemSwipe(object sender, ItemSwipeEventArgs e)
{
    var item = e.SwipedItem as EmailObject;
    if (item != null)
    {
        if (e.Direction == SwipeListDirection.Left)
        {
            item.Unread = !item.Unread;
        }
        else
        {
            //(Resources["Emails"] as EmailCollection).Remove(item);
            var swipeListView = sender as SwipeListView;
            var itemContainer = swipeListView?.ContainerFromItem(item) as SwipeListViewItem;
            if (itemContainer != null)
            {
                itemContainer.Visibility = Visibility.Collapsed;
            }
        }
    }
}

在演示中,它最初从项目源中删除了项目。我注释掉它的代码并改为隐藏 SwipeListViewItem