Hi, Lyubo.
Please don't mind if I continue to ask this question.
My current program creates a behavior class RectanglesBehavior inherited from PanBehavior. How to use the code in this class to implement the Diagram.AdjustmentHandlesSize property to control the size of the handle, and use various Diagram * HandlesStyle to achieve the effect of screenshot 9_21_4.png?
class RectanglesBehavior : PanBehavior
{
public RectanglesBehavior(Diagram diagram) : base(diagram, false, true)
{
diagram.DoubleClicked += OnDiagramDoubleClicked;
}
void OnDiagramDoubleClicked(object sender, DiagramEventArgs e)
{
// hold down the Ctrl key + double-click
if (Keyboard.Modifiers == ModifierKeys.Control)
{
var cx = e.MousePosition.X;
var cy = e.MousePosition.Y;
var rectangle1 = Diagram.Factory.CreateShapeNode(
cx - 50, cy - 50, 100, 100, Shapes.Rectangle);
rectangle1.Brush = Brushes.Transparent;
rectangle1.Stroke = Brushes.Green;
}
}
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;
node.Shape = Shapes.Rectangle;
node.Stroke = Brushes.AliceBlue;
node.StrokeThickness = 0.06;
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.