private void RectangleSelection_PointerPressed(object sender, PointerRoutedEventArgs e) { if (scrollViewer == null) { return; } itemsPosition.Clear(); scrollViewer.ViewChanged -= ScrollViewer_ViewChanged; scrollViewer.ViewChanged += ScrollViewer_ViewChanged; originDragPoint = new Point(e.GetCurrentPoint(uiElement).Position.X, e.GetCurrentPoint(uiElement).Position.Y); // Initial drag point relative to the topleft corner prevSelectedItems = uiElement.SelectedItems.Cast <object>().ToList(); // Save current selected items var verticalOffset = scrollViewer.VerticalOffset; originDragPoint.Y += verticalOffset; // Initial drag point relative to the top of the list (considering scrolled offset) if (!e.GetCurrentPoint(uiElement).Properties.IsLeftButtonPressed || e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch) { // Trigger only on left click, do not trigger with touch return; } FetchItemsPosition(); selectionStrategy = e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) ? new InvertPreviousItemSelectionStrategy(uiElement.SelectedItems, prevSelectedItems) : e.KeyModifiers.HasFlag(VirtualKeyModifiers.Shift) ? (ItemSelectionStrategy) new ExtendPreviousItemSelectionStrategy(uiElement.SelectedItems, prevSelectedItems) : new IgnorePreviousItemSelectionStrategy(uiElement.SelectedItems); selectionStrategy.HandleNoItemSelected(); uiElement.PointerMoved -= RectangleSelection_PointerMoved; uiElement.PointerMoved += RectangleSelection_PointerMoved; if (selectionChanged != null) { // Unsunscribe from SelectionChanged event for performance uiElement.SelectionChanged -= selectionChanged; } uiElement.CapturePointer(e.Pointer); selectionState = SelectionState.Starting; }