WPF封装一个鼠标事件控件界面框选的功能
- 基类定义Mouse的状态方法,以及把界面控件传入
csharp
public abstract class MouseEventBase<T> where T : UserControl
{
public MouseEventBase(T associatedControl, Rectangle rect)
{
map = associatedControl;
SelectionRect = rect;
}
public MouseEventBase(T associatedControl, Canvas canvas)
{
map = associatedControl;
SelectionPolygon = canvas;
}
protected T map { get; private set; }
protected Rectangle? SelectionRect;
protected Canvas? SelectionPolygon;
protected double Width => map.ActualWidth;
protected double Height => map.ActualHeight;
public ToolMode PageMode { get; set; }
public virtual void MouseDown(Point imageLocation, Point mapLocation) { }
public virtual void MouseMove(Point imageLocation, Point mapLocation) { }
public virtual void MouseUp(Point imageLocation, Point mapLocation) { }
}
- 框选交互的基类
csharp
/// <summary>
/// 框选基类
/// </summary>
public abstract class BoxSelectionBase : MouseEventBase<UserControl>
{
/// <summary>
/// 是否是正常框选,或者反向框选
/// </summary>
protected bool BoxDirection = true;
private Point startPoint;
public BoxSelectionBase(UserControl map, Rectangle rect) : base(map, rect)
{
PageMode = ToolMode.None;
SelectionRect = rect;
}
public override void MouseDown(Point imageLocation, Point mapLocation)
{
startPoint = mapLocation;
SelectionRect!.Width = 0;
SelectionRect.Height = 0;
// 显示选择框
SelectionRect.Visibility = Visibility.Visible;
SelectionRect.Margin = new Thickness(startPoint.X, startPoint.Y, 0, 0);
SelectionRect.Width = 0;
SelectionRect.Height = 0;
}
public override void MouseMove(Point imageLocation, Point mapLocation)
{
var minX = startPoint.X < mapLocation.X ? startPoint.X : mapLocation.X;
var minY = startPoint.Y < mapLocation.Y ? startPoint.Y : mapLocation.Y;
var maxX = startPoint.X > mapLocation.X ? startPoint.X : mapLocation.X;
var maxY = startPoint.Y > mapLocation.Y ? startPoint.Y : mapLocation.Y;
var left = Math.Max(0, Math.Min(minX, Width));
var top = Math.Max(0, Math.Min(minY, Height));
maxX = Math.Max(0, Math.Min(maxX, Width));
maxY = Math.Max(0, Math.Min(maxY, Height));
var width = maxX - left;
var height = maxY - top;
SelectionRect!.Margin = new Thickness(left, top, 0, 0);
SelectionRect.Width = width;
SelectionRect.Height = height;
BoxDirection = mapLocation.X >= startPoint.X;
}
public override void MouseUp(Point imageLocation, Point mapLocation)
{
SelectionRect!.Visibility = Visibility.Collapsed;
}
- 实际使用只需要继承Mouse状态加上自己的功能即可,绘制功能在基类中完成了