|
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
-
- namespace BPASmartClient.CustomResource.UserControls.DeCanvas
- {
- public class RubberbandAdorner :Adorner
- {
- private Point? startPoint;
- private Point? endPoint;
- private Pen rubberbandPen;
-
- private DesignerCanvas designerCanvas;
-
- public RubberbandAdorner(DesignerCanvas designerCanvas,Point? dragStartPoint)
- : base(designerCanvas)
- {
- this.designerCanvas = designerCanvas;
- this.startPoint = dragStartPoint;
- rubberbandPen = new Pen(Brushes.LightSlateGray,1);
- rubberbandPen.DashStyle = new DashStyle(new double[] { 2 },1);
- }
-
- protected override void OnMouseMove(System.Windows.Input.MouseEventArgs e)
- {
- if (e.LeftButton == MouseButtonState.Pressed)
- {
- if (!this.IsMouseCaptured)
- this.CaptureMouse();
-
- endPoint = e.GetPosition(this);
- UpdateSelection();
- this.InvalidateVisual();
- }
- else
- {
- if (this.IsMouseCaptured) this.ReleaseMouseCapture();
- }
-
- e.Handled = true;
- }
-
- protected override void OnMouseUp(System.Windows.Input.MouseButtonEventArgs e)
- {
- // release mouse capture
- if (this.IsMouseCaptured) this.ReleaseMouseCapture();
-
- // remove this adorner from adorner layer
- AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this.designerCanvas);
- if (adornerLayer != null)
- adornerLayer.Remove(this);
-
- e.Handled = true;
- }
-
- protected override void OnRender(DrawingContext dc)
- {
- base.OnRender(dc);
-
- // without a background the OnMouseMove event would not be fired !
- // Alternative: implement a Canvas as a child of this adorner, like
- // the ConnectionAdorner does.
- dc.DrawRectangle(Brushes.Transparent,null,new Rect(RenderSize));
-
- if (this.startPoint.HasValue && this.endPoint.HasValue)
- dc.DrawRectangle(Brushes.Transparent,rubberbandPen,new Rect(this.startPoint.Value,this.endPoint.Value));
- }
-
- private void UpdateSelection()
- {
- foreach (ISelectable item in designerCanvas.SelectedItems)
- item.IsSelected = false;
- designerCanvas.SelectedItems.Clear();
-
- Rect rubberBand = new Rect(startPoint.Value,endPoint.Value);
- foreach (Control item in designerCanvas.Children)
- {
- Rect itemRect = VisualTreeHelper.GetDescendantBounds(item);
- Rect itemBounds = item.TransformToAncestor(designerCanvas).TransformBounds(itemRect);
-
- if (rubberBand.Contains(itemBounds) && item is ISelectable)
- {
- ISelectable selectableItem = item as ISelectable;
- selectableItem.IsSelected = true;
- designerCanvas.SelectedItems.Add(selectableItem);
- }
- }
- }
- }
- }
|