wpf 画选择框线

http://tech.ddvip.com/2010-08/1282199732159206_3.html

当按住鼠标左键点击DesignerCanvas时将生成RubberbandAdorner,代码如下:

  代码

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class DesignerCanvas : Canvas
{
  ...
  protected override void OnMouseMove(MouseEventArgs e)
  {
    base.OnMouseMove(e);
    if (e.LeftButton != MouseButtonState.Pressed)
      this.dragStartPoint = null;
    if (this.dragStartPoint.HasValue)
    {
      AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this);
      if (adornerLayer != null)
      {
        RubberbandAdorner adorner = new RubberbandAdorner(this, dragStartPoint);
        if (adorner != null)
        {
          adornerLayer.Add(adorner);
        }
      }
      e.Handled = true;
    }    
  }
  ...
}

  生成RubberbandAdorner : Adorner

  代码

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class RubberbandAdorner : Adorner
{  
  ....
  private Point? startPoint, endPoint;
  protected override void OnMouseMove(MouseEventArgs e)
  {
    if (e.LeftButton == MouseButtonState.Pressed)
    {
      if (!this.IsMouseCaptured)
      {
        this.CaptureMouse();
      }
      this.endPoint = e.GetPosition(this);
      this.UpdateRubberband();
      this.UpdateSelection();
      e.Handled = true;
    }
  }
private void UpdateRubberband()
{
  double left = Math.Min(this.startPoint.Value.X, this.endPoint.Value.X);
  double top = Math.Min(this.startPoint.Value.Y, this.endPoint.Value.Y);
  double width = Math.Abs(this.startPoint.Value.X - this.endPoint.Value.X);
  double height = Math.Abs(this.startPoint.Value.Y - this.endPoint.Value.Y);
  this.rubberband.Width = width;
  this.rubberband.Height = height;
  Canvas.SetLeft(this.rubberband, left);
  Canvas.SetTop(this.rubberband, top);
}
private void UpdateSelection()
{
  Rect rubberBand = new Rect(this.startPoint.Value, this.endPoint.Value);
  foreach (DesignerItem item in this.designerCanvas.Children)
  {
    Rect itemRect = VisualTreeHelper.GetDescendantBounds(item);
    Rect itemBounds = item.TransformToAncestor
      (designerCanvas).TransformBounds(itemRect);
    if (rubberBand.Contains(itemBounds))
    {
      item.IsSelected = true;
    }
    else
    {
      item.IsSelected = false;
    }
  }
}
  ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值