private static void DragMultiSelectEnabled_ListView_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            var   listView = sender as ListView;
            Point currentPointOnListView = e.GetPosition(listView);
            ListViewDragSelectAdorner dragSelectAdorner = GetListViewDragSelectAdorner(listView);

            // select the item when adorner is not displayed.
            if (!IsCtrlShiftDown() && dragSelectAdorner == null)
            {
                HitTestResult hitTestResult = VisualTreeHelper.HitTest(listView, currentPointOnListView);
                var           hitItem       = hitTestResult == null ? null : GetAncestorListViewItem(hitTestResult.VisualHit);
                if (hitItem != null)
                {
                    listView.UnselectAll();
                    hitItem.Focus();
                    hitItem.IsSelected = true;
                }
            }

            SetDragMultiSelectStartPoint(listView, null);
            if (dragSelectAdorner != null)
            {
                RemoveListViewDragSelectAdorner(listView);
                listView.ReleaseMouseCapture();

                // prevent deselecting by default listview behavior
                if (!IsCtrlShiftDown())
                {
                    e.Handled = true;
                }
            }
        }
        private static void RemoveListViewDragSelectAdorner(ListView listView)
        {
            var          target       = GetListViewItemsPanel(listView);
            AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(target);
            ListViewDragSelectAdorner dragSelectAdorner = GetListViewDragSelectAdorner(listView);

            adornerLayer.Remove(dragSelectAdorner);
            SetListViewDragSelectAdorner(listView, null);
        }
        private static void AddListViewDragSelectAdorner(ListView listView, Point startPoint)
        {
            var          target       = GetListViewItemsPanel(listView);
            AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(target);
            ListViewDragSelectAdorner dragSelectAdorner = new ListViewDragSelectAdorner(target)
            {
                StartPoint = startPoint, EndPoint = startPoint
            };

            adornerLayer.Add(dragSelectAdorner);
            SetListViewDragSelectAdorner(listView, dragSelectAdorner);
        }
        private static void DragMultiSelectEnabled_ListView_Scrolled(object sender, ScrollChangedEventArgs e)
        {
            var listView = sender as ListView;
            ListViewDragSelectAdorner dragSelectAdorner = GetListViewDragSelectAdorner(listView);

            if (dragSelectAdorner != null)
            {
                dragSelectAdorner.StartPoint = new Point(
                    dragSelectAdorner.StartPoint.X - e.HorizontalChange,
                    dragSelectAdorner.StartPoint.Y - e.VerticalChange);
            }
        }
        private static void DragMultiSelectEnabled_ListView_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            var listView   = sender as ListView;
            var itemsPanel = GetListViewItemsPanel(listView);
            ListViewDragSelectAdorner dragSelectAdorner = GetListViewDragSelectAdorner(listView);
            Point currentPointOnItemsPanel = e.GetPosition(itemsPanel);
            Point?dragStartPointNull       = GetDragMultiSelectStartPoint(listView);

            if (e.MouseDevice.LeftButton == MouseButtonState.Pressed)
            {
                // start drag adorner
                if (dragSelectAdorner == null && dragStartPointNull.HasValue)
                {
                    Point dragStartPoint = dragStartPointNull.Value;
                    if (Math.Abs(dragStartPoint.X - currentPointOnItemsPanel.X) > SystemParameters.MinimumHorizontalDragDistance ||
                        Math.Abs(dragStartPoint.Y - currentPointOnItemsPanel.Y) > SystemParameters.MinimumVerticalDragDistance)
                    {
                        AddListViewDragSelectAdorner(listView, dragStartPoint);
                        listView.CaptureMouse();
                        if (!IsCtrlShiftDown())
                        {
                            listView.UnselectAll();
                        }
                    }
                    else
                    {
                        // nothing to do
                    }
                }

                dragSelectAdorner = GetListViewDragSelectAdorner(listView);
                if (dragSelectAdorner != null)
                {
                    // Expand the adorner
                    dragSelectAdorner.EndPoint = currentPointOnItemsPanel;

                    // select the items being under the adorner
                    var items = itemsPanel.Children;
                    foreach (ListViewItem item in items)
                    {
                        item.IsSelected = IsItemUnderAdorner(itemsPanel, item, dragSelectAdorner);
                    }
                }
            }
        }
        private static bool IsItemUnderAdorner(UIElement parent, FrameworkElement item, ListViewDragSelectAdorner adorner)
        {
            Point  iTopLeft     = item.TranslatePoint(new Point(0, 0), parent);
            Point  iRightButtom = item.TranslatePoint(new Point(item.ActualWidth, item.ActualHeight), parent);
            double aLeft        = Math.Min(adorner.StartPoint.X, adorner.EndPoint.X);
            double aRight       = Math.Max(adorner.StartPoint.X, adorner.EndPoint.X);
            double aTop         = Math.Min(adorner.StartPoint.Y, adorner.EndPoint.Y);
            double aButtom      = Math.Max(adorner.StartPoint.Y, adorner.EndPoint.Y);

            return(IsRangeOverlap(iTopLeft.X, iRightButtom.X, aLeft, aRight) &&
                   IsRangeOverlap(iTopLeft.Y, iRightButtom.Y, aTop, aButtom));
        }
 private static void SetListViewDragSelectAdorner(DependencyObject obj, ListViewDragSelectAdorner value)
 {
     obj.SetValue(ListViewDragSelectAdornerProperty, value);
 }