Hi, Slavcho
Before implementing the custom class RectanglesBehavior, you can drag the view at will in the diagram by holding down the left mouse button, but it won’t work after the implementation. What kind of modification is needed for RectanglesBehavior?
namespace AOI
{
class RectanglesBehavior:DrawShapesBehavior
{
public RectanglesBehavior(Diagram diagram):base(diagram)
{
}
public override InteractionState StartDraw(Point point)
{
Diagram.ModifierKeyActions.Control = ModifierKeyAction.None;
if (Keyboard.Modifiers == ModifierKeys.Control)
{
//return new InteractionState(new ShapeNode(Diagram), null, MindFusion.Diagramming.Wpf.Action.Create);
var node = new ShapeNode(Diagram);
node.Brush = Brushes.Transparent;
return new InteractionState(node, null, MindFusion.Diagramming.Wpf.Action.Create);
}
var selected = Diagram.ActiveItem as ShapeNode;
if (selected!=null)
{
var handle = selected.HitTestHandle(point);
if (handle != null)
return new InteractionState(selected, handle, MindFusion.Diagramming.Wpf.Action.Modify);
}
/*
var rect = NearestRect(point);
if (rect != null)
{
var handlesStyle = rect.HandlesStyle;
rect.HandlesStyle = HandlesStyle.SquareHandles2;
var handle = rect.HitTestHandle(point);
rect.HandlesStyle = handlesStyle;
if (handle != null)
return new InteractionState(rect, handle, Action.Modify);
}*/
// return base.StartDraw(point);
return null;
}
/*public override CursorHint SetMouseCursor(Point point, out bool startInteraction)
{
return base.SetMouseCursor(point, out startInteraction);
}*/
/*protected override void OnMouseUp(Point mousePosition, MindFusion.Diagramming.Wpf.MouseButton mouseButton)
{
base.OnMouseUp(mousePosition, mouseButton);
}*/
DiagramNode NearestRect(Point point)
{
DiagramNode nearest = null;
double minDist = double.MaxValue;
foreach (var node in Diagram.Nodes)
{
if (node.Locked)
continue;
var dist = DistToRect(point, node.Bounds);
if (dist < minDist)
{
minDist = dist;
nearest = node;
}
}
return nearest;
}
double DistToRect(Point point, Rect rect)
{
var v = new[]
{
new Point(rect.Left, rect.Top),
new Point(rect.Right, rect.Top),
new Point(rect.Right, rect.Bottom),
new Point(rect.Left, rect.Bottom),
};
double minDist = double.MaxValue;
for (var i = 0; i < 4; i++)
{
var v1 = v[i];
var v2 = v[(i + 1) % 4];
var dist = MindFusion.Utilities.DistToLineSegment(point, v1, v2);
if (dist < minDist)
minDist = dist;
}
return minDist;
}
}
}
Best regards.