protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); adorner = new RectAdorner(this); adorner.Origin = e.GetPosition(this); adorner.Show(); Mouse.Capture(this); }
protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e) { base.OnPreviewMouseLeftButtonUp(e); if (Mouse.Captured == null) { return; } Mouse.Capture(null); adorner.Hide(); var origin = adorner.Origin; var dest = adorner.Destination; adorner = null; List <MyMultiSelecterItem> hitItems = new List <MyMultiSelecterItem>(); VisualTreeHelper.HitTest( this, new HitTestFilterCallback((d) => { if (d is MyMultiSelecterItem) { return(HitTestFilterBehavior.ContinueSkipChildren); } else { return(HitTestFilterBehavior.ContinueSkipSelf); } }), new HitTestResultCallback((result) => { var geometryResult = result as GeometryHitTestResult; if (geometryResult == null) { return(HitTestResultBehavior.Continue); } if (geometryResult.IntersectionDetail != IntersectionDetail.Empty) { hitItems.Add(geometryResult.VisualHit as MyMultiSelecterItem); } return(HitTestResultBehavior.Continue); }), new GeometryHitTestParameters(new RectangleGeometry(new Rect(origin, dest)))); var oldSelectedVMs = SelectedItems.OfType <object>().ToList(); BeginUpdateSelectedItems(); SelectedItems.Clear(); foreach (var item in hitItems) { SelectedItems.Add(ItemContainerGenerator.ItemFromContainer(item)); } foreach (var oldSelectedVM in oldSelectedVMs) { var oldSelected = ItemContainerGenerator.ContainerFromItem(oldSelectedVM) as MyMultiSelecterItem; if (oldSelected != null) { oldSelected.IsSelected = false; } } foreach (var selected in hitItems) { selected.IsSelected = true; } EndUpdateSelectedItems(); }