【问题标题】:Windows Store App: How to make ListView with expandable/enlargeable ListItems?Windows Store App:如何使用可扩展/可放大的 ListItems 制作 ListView?
【发布时间】:2014-01-24 22:45:20
【问题描述】:

我有一个包含项目的 Listview,在 C# Windows Store 应用程序中(这就是你所说的吗?我听说它们不再称为 Metro Apps)。

类似于 Android 中的 ExpandableListView,我希望能够点击列表项(不是按钮)以展开该列表项,点击展开的列表项 使其折叠,如果您点击另一个列表项,当前展开的列表项将折叠,另一个将展开。

在我的特殊情况下,我有一个 DataTemplate 用于列表项的展开和非展开视图。我已经看到 Android 的 ExpandableListView 可以使用 附加 信息来扩展列表项(WPF 中的 Expander 做了类似的事情),而不是 用更大的项目替换它 ,但在 Windows 应用商店应用程序中是否有一个通用的解决方案? 如果不是,最接近的等价物是什么?

如下图所示,我想知道是否有一个组件可以以这种方式扩展列表项,或者如果没有,我有哪些替代方案:

【问题讨论】:

    标签: c# xaml listview touch windows-store-apps


    【解决方案1】:

    我最终得到了一个可行但看起来不太花哨的解决方案。当您单击项目但没有动画时它会切换DataTemplate:它会立即切换。

    这是重要的代码部分:

    XAML

    <Page.Resources>
        <DataTemplate x:Key="dtSmall">
            <!--Component template for the un-expanded listitems-->
        </DataTemplate>
        <DataTemplate x:Key="dtEnlarged">
            <!--Component template for the expanded listitems-->
        </DataTemplate>
    </Page.Resources>
    <Grid>
        <ListView x:Name="lvEnlargeable"
            IsItemClickEnabled="True"
            ItemTemplate="{StaticResource dtSmall}"
            ItemsSource="{Binding ...}"
            SelectionChanged="LVEnlargeable_SelectionChanged"
            ItemClick="LVEnlargeable_ItemClick"/>
    </Grid>
    

    XAML.CS

    public sealed partial class MainPage : Page
    {
        private DataTemplate dtSmall;
        private DataTemplate dtEnlarged;
    
        public MainPage()
        {
            this.InitializeComponent();
            dtSmall = (DataTemplate)Resources["dtSmall"];
            dtEnlarged = (DataTemplate)Resources["dtEnlarged"];
        }
    
        // A selected item is treated as an expanded/enlarged item
        private void LVEnlargeable_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            /* First we set all the items that has been deselected
            to be collapsed, aka. using the dtSmall DataTemplate.
            We expect 0 or 1 item to have been deselected
            but handle all cases easily with a foreach loop.
            */
            foreach (var item in e.RemovedItems)
            {
                // Set the DataTemplate of the deselected ListViewItems
                ((ListViewItem)(sender as ListView).ContainerFromItem(item)).ContentTemplate = dtSmall;
            }
    
            /* Then we set all the items that has been selected
            to be expanded.
            We should probably throw an Exception if more than 1 was found,
            because it's unwanted behavior, but we'll ignore that for now.
            */
            foreach (var item in e.AddedItems)
            {
                ((ListViewItem)(sender as ListView).ContainerFromItem(e.AddedItems[0])).ContentTemplate = dtEnlarged;
            }
        }
    
        /* We need click events because SelectionChanged-events
        cannot detect clicks on an already selected item */
        private void LVEnlargeable_ItemClick(object sender, ItemClickEventArgs e)
        {
            ListView lv = (sender as ListView);
    
            /* Having set the IsItemClickEnabled property on the ListView to True
            we have to handle selection events manually.
            If nothing is selected when this click occurs, then select this item*/
            if (lv.SelectedItem == null)
            {
                lv.SelectedItem = e.ClickedItem;
            }
            else
            {
                // Clicking on an expanded/selected/enlarged item will deselect it
                if (lv.SelectedItem.Equals(e.ClickedItem))
                {
                    lv.SelectedItem = null;
                }
                else
                {   /* If it's not a selected item, then select it
                        (and let SelectionChanged unselect the already selected item) */
                    lv.SelectedItem = e.ClickedItem;
                }
            }
        }
    }
    

    我还没有测试过这个孤立的代码本身是否足以解决这个问题,但我希望是的,而且这个代码至少包含了关键点。已经很晚了,我只是想为有好奇心的人发布一些东西。如果这显示不适合您,请就该问题发表评论,我会确保添加缺失的部分。

    我还弄乱了 ListViewItemStyleContainer 的 ListViewItemPresenter 以获得更好的选择效果等,但我认为最好保持简短。如果你也觉得这很有趣,那么也可以随时发表评论,我会尝试加入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2013-01-10
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多