尝试在 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。
我发现了一个与我相似的问题: 然而,即使我将 MinHeigh
t 和 Padding
设置为 [=14=,它似乎对我不起作用].
编辑:
经过测试,我发现这与 ListView
无关,而是与 SwipeListView
.
有关
SwipeListView
添加了很多其他控件,只有突出显示的部分会设置为折叠,其他部分仍然可见。
我不知道你是如何实现"HideForUndo"功能的细节。但是如果你能拿到选中的item,我觉得你可以试试用ItemsControl.ContainerFromItem method to get the item container which in SwipeListView就是SwipeListViewItem
。有了SwipeListViewItem
后,你可以设置SwipeListViewItem.Visibility
到Visibility.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
。
我正在尝试为我的 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。
我发现了一个与我相似的问题:MinHeigh
t 和 Padding
设置为 [=14=,它似乎对我不起作用].
编辑:
经过测试,我发现这与 ListView
无关,而是与 SwipeListView
.
有关
SwipeListView
添加了很多其他控件,只有突出显示的部分会设置为折叠,其他部分仍然可见。
我不知道你是如何实现"HideForUndo"功能的细节。但是如果你能拿到选中的item,我觉得你可以试试用ItemsControl.ContainerFromItem method to get the item container which in SwipeListView就是SwipeListViewItem
。有了SwipeListViewItem
后,你可以设置SwipeListViewItem.Visibility
到Visibility.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
。