Windows Store App: How to make ListView with expandable/enlargeable ListItems?

前端 未结 1 641
旧时难觅i
旧时难觅i 2021-02-02 04:21

I have a Listview with items, in a C# Windows Store App (is that what you call these? I heard they\'re not called Metro Apps anymore).

Similar to the ExpandableListView

1条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-02-02 05:14

    I ended up with a solution that works but doesn't look too fancy. It switches DataTemplate when you click items but there's no animation: it switches instantly.

    Here's the important code parts:

    XAML

    
        
            
        
        
            
        
    
    
        
    
    

    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;
                }
            }
        }
    }
    

    I haven't tested if this isolated code is enough, on its own, for this solution, but I hope it is, and this code at least contain the key points. It's late and I just wanted to post something for the curious-minded people. If this shows not to work for you, then please leave a comment about the issue and I'll make sure to add the missing parts.

    I also messed with the ListViewItemStyleContainer's ListViewItemPresenter to have better selection effects etc. but I figure it's best to keep it short. If you find this interesting as well, then feel free to leave a comment for that too, and I'll try include it.

    0 讨论(0)
提交回复
热议问题