我正在尝试为我的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
无关
SwipeListView
为其添加了许多其他控件,只有突出显示的部分会设置为折叠,其他部分仍然可见。
答案 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
。