如何更改单击的ListView项(UWP)的高度? 像Mail App一样

这是我想要做的。 我有一个非常简单的ListView,它有一个dataTemplate,它绑定到页面代码中的ObservableCollection。 相当简单吧? 现在,我希望在单击列表视图后立即更改单个项目的高度。

Windows的Mail和Wifi-Ui使用这种操作。 检查图像以了解更好。

可能的解决方案: – 我在Xaml中定义了两个datatemplate作为资源,在click事件中我正在更改listview的ItemTemplateSelector属性。 但问题是listview中的每个项目都会更改为该数据模板,顺便说一下。 但这不是我想要实现的。 我只想在点击时更改listview中单个项目的高度,甚至可能使用一些动画。

可能的第二个解决方案:我在我的Xaml中只定义了一个包含网格的数据模板。 现在我正在做的是将网格的高度绑定到c#代码中的公共属性。 在Itemclick事件中,我获取了e.ClickedItem,然后将属性的高度更改为不同的值。 这应该可以工作,但绑定到网格高度的值确实会发生变化,但不会反映在UI中。 它与{Bind语句}有什么关系,我需要使用{x:Bind}吗?

在这里输入图像描述这是折叠版本看起来像…

在此处输入图像描述这是扩展版本看起来喜欢的内容,并且动画会发生整个扩展的事情。

可能的解决方案1

您可以拥有两个共享某些UI的数据模板,另一个具有比另一个更多的元素。 您将遇到的问题是如何在动态点击时更新到其他模板。

我最近在这里回答了一个问题,它通过订阅IsSelected属性并手动重置ContentTemplateSelector来强制更新模板来解决这个问题。

但是将完整的模板交换给我是一种矫枉过正,我也倾向于你的第二个解决方案。

可能的解决方案2

看起来您正在尝试通过ViewModel中的属性更新Height ,这可能会有效。 但对我来说,这种UI逻辑更好地放在代码隐藏中,您可以在ItemClick回调中轻松获取Grid ,并为其分配不同的Height

但是,如果你需要类似的ListView在其他地方有类似的要求呢? 你最终会得到很多重复的代码隐藏代码。 这就是为什么我实际上扩展了ListViewItemfunction以满足在其ItemTemplate扩展UI的某些部分的原因。 所以这是如何 –

首先,让我们创建一个inheritance自ListViewItemExtendedListViewItem 。 这种扩展控制做了两件事 –

  1. 创建一个名为IsExpandable附加属性 ,该属性稍后将附加到ListView数据模板中的某个UI元素。
  2. 因为每次单击ListViewItem时, IsSelected属性都会更新,我们可以监视它以相应地显示和隐藏IsExpandable元素。

 public class ExtendedListViewItem : ListViewItem { public ExtendedListViewItem() { // This could be set in its default style in Generic.xaml instead. HorizontalContentAlignment = HorizontalAlignment.Stretch; RegisterPropertyChangedCallback(IsSelectedProperty, (s, e) => { // Children() is available at // https://github.com/JustinXinLiu/Continuity/blob/0cc3d7556c747a060d40bae089b80eb845da84fa/Continuity/Extensions/UtilExtensions.cs#L25 foreach (var child in this.Children()) { if (GetIsExpandable(child)) { child.Visibility = IsSelected ? Visibility.Visible : Visibility.Collapsed; } } }); } public static void SetIsExpandable(DependencyObject element, bool value) => element.SetValue(IsExpandableProperty, value); public static bool GetIsExpandable(DependencyObject element) => (bool)element.GetValue(IsExpandableProperty); public static readonly DependencyProperty IsExpandableProperty = DependencyProperty.RegisterAttached( "IsExpandable", typeof(bool), typeof(ExtendedListViewItem), new PropertyMetadata(default(bool), (s, e) => { var element = (UIElement)s; element.Visibility = (bool)e.NewValue ? Visibility.Collapsed : Visibility.Visible; })); } 

接下来,我们还需要扩展ListView控件以将ExtendedListViewItem控件作为其子控件而不是默认的ListViewItem


 public class ExtendedListView : ListView { protected override DependencyObject GetContainerForItemOverride() { return new ExtendedListViewItem(); } } 

最后,是时候将IsExpandable标志附加到正确的元素。 例如,我只想在单击项目时显示文本 –


           

奖金

注意到ExtendedListView控件正在订阅一个名为ContainerContentChanging的事件? 在这里,您可以为项目创建隐式偏移动画,以使布局更改更有趣。


  private void OnMyListViewContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) { var containerVisual = ElementCompositionPreview.GetElementVisual(args.ItemContainer); if (args.InRecycleQueue) { containerVisual.ImplicitAnimations = null; } else { // EnableImplicitAnimation() is available at // https://github.com/JustinXinLiu/Continuity/blob/0015a96897c138e09d8604267df46da936b66838/Continuity/Extensions/CompositionExtensions.Implicit.cs#L144 containerVisual.EnableImplicitAnimation(VisualPropertyType.Offset, 400.0f); } } 

结果 在此处输入图像描述

希望这可以帮助!

好的,对不起,我现在明白了。 首先,您需要在xaml中设置列表视图的名称和原始高度。

  

接下来,您想要了解有关单击按钮的代码。 在此之内。 你需要输入一个声明,将高度设置为不同的值。 它实际上非常简单。

  private void Button_Click (object sender, RoutedEventArgs e) { GenericName.Height = NewValue; } 

那应该有用。