尝试隐藏UWP中的selecteditem时,如何删除listview的占位符?

时间:2016-10-17 18:05:58

标签: c# xaml listview uwp uwp-xaml

我正在尝试为我的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>

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

我发现了一个类似于我的问题:How do you hide a ListView Item placeholder when it's DataTemplate child is collapsed?但是,即使我将MinHeigh t和Padding设置为0,它似乎对我也无效。

修改: 经过测试,我发现这与ListView无关,而与SwipeListView无关 enter image description here

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

1 个答案:

答案 0 :(得分:1)

我不知道有关如何实现“HideForUndo”功能的详细信息。但是,如果您可以获取所选项目,我认为您可以尝试使用ItemsControl.ContainerFromItem方法获取SwipeListView中的SwipeListViewItem项目容器。获得SwipeListViewItem后,您可以将SwipeListViewItem.Visibility设置为Visibility.Collapsed以隐藏整个项目。

SwipeListView class的源代码中,我们可以发现它来自ListView class,而ListView来自ItemsControl,因此我们可以使用ItemsControl.ContainerFromItem方法与SwipeListView

此处使用Demo中的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