Win RT Xaml GridView: Drag select multiple items

2019-06-05 06:21发布

问题:

I'm trying to select multiple items in a GridView by hovering over them with pressed mouse (like drawing). I tried to achieve this with the PointerEntered event but I'm unable to change the selction from code. Is there a way to implement a custom selection mode?

This didn't work for me because I can't use Style.Triggers in Win RT XAML: https://stackoverflow.com/a/2886223/5739170

回答1:

You will have to inherit the gridview control and override the PrepareContainerForItemOverride method:

The code:

public class MyGridView : GridView
{

    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        (element as GridViewItem).PointerMoved += MyGridView_PointerMoved;

        base.PrepareContainerForItemOverride(element, item);
    }

    private void MyGridView_PointerMoved(object sender, PointerRoutedEventArgs e)
    {

 //your logic for setting the isselected
         (sender as GridViewItem).IsSelected = true;
    }
}


回答2:

This is how I finally implemented it based on Chirag Shah's answer:

class MyGridView : GridView
{
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        (element as GridViewItem).PointerEntered += SelectItemOnEntered;
        (element as GridViewItem).AddHandler(PointerPressedEvent, new PointerEventHandler(SelectItemOnPressed), true);
        base.PrepareContainerForItemOverride(element, item);
    }

    private void SelectItemOnPressed(object sender, PointerRoutedEventArgs e)
    {
        (sender as GridViewItem).IsSelected = !(sender as GridViewItem).IsSelected;
    }

    private void SelectItemOnEntered(object sender, PointerRoutedEventArgs e)
    {
        if (e.Pointer.IsInContact)
            (sender as GridViewItem).IsSelected = !(sender as GridViewItem).IsSelected;
    }
}

I hope this helps everyone who wants to implement this selection mode.