本文整理了用户在使用MindFusion.Diagramming for WinForms经常遇见的问题,希望对您有所帮助~
问:移动形状后是否有任何事件发生?我们保持一些与控件中形状位置相关的状态,并且需要知道它们何时被移动?
答:移动节点或调整节点大小时会引发NodeModified事件。检查AdjustmentHandle事件参数以确切了解发生的情况。如果是AdjustmentHandles.Move,则表示节点已被移动。
问:我试图通过在我的表单中的DiagramView控件的实例上将AllowDrop设置为true来使FlowChart.NET控件表现为放置目标。看起来(基于鼠标光标的反馈)控件没有响应作为放置目标。我该怎么办?
答:您还必须处理DragOver和DragDrop事件:
diagramView_OnDragOver...
{
// for mouse feedback
e.Effect = DragDropEffects.Copy;
}
diagramView_OnDrop...
{
//get the dragged data and apply
//it to the diagram as you need
}
问:每次在图表上移动项目时,我都可以强制使用ResizeToFitItems吗?
答:您可以启用Diagram.AutoResize属性,而不是响应事件处理程序调用ResizeToFitItems。
问: SelectionMoved事件仅在选择了2个或更多项目时才会生效,而不适用于单个项目。是否有另一个事件或属性会将单个对象识别为选择?
答: SelectionMoved仅用于多选。如果需要检测单个项的修改,则应该处理更多事件,例如NodeModified和LinkModified。
问:我需要检测表行的双击,但NodeDoubleClicked事件仅在单击表头时触发,而不是行。如果单击表格的任何部分,我该如何实现?
答:处理CellDoubleClicked,双击表格单元格时会引发它。检查单元格的Row属性以确定单击了哪一行。
问:如何从ListView或TreeView控件拖放到FlowChart控件?
下面是场景:用户在树视图控件中选择一个树节点,然后将其拖到flowChart控件的顶部。拖动FlowChart控件时,拖动光标看起来像文本框。删除后,FlowChart控件中将出现一个文本框。
答:您可以通过从TreeView.MouseDown事件处理程序调用Control.DoDragDrop,并在DiagramView.DragDrop事件中创建节点来实现。请参阅Flowcharter示例项目中的ListView,以及FCDemo示例的“其他”步骤之一。
问:如何在启用AllowInplaceEdit时阻止编辑某些节点的文本?
答:当用户双击某个节点时,会引发一个Diagram.NodeTextEditing验证事件。将e.Cancel设置为true可防止编辑某些节点的文本。
问:我已将DiagramView对象的Behavior属性设置为DrawLinks,但是当我从Node拖动到Node时,我只选择了两个节点,没有绘制链接。我应该检查哪些设置可能会影响此行为?
答:检查Diagram.AllowUnanchoredLinks和DiagramNode.AllowOutgoingLinks。如果已禁用前者,则只能从设置了AnchorPattern的节点绘制链接。
问:我正在使用节点图像生成图表,并希望用户只需单击即可开始移动节点。此外,用户不应该能够创建新项目,也不能调整现有项目的大小。我应该为此创建自定义行为对象吗?
答:这可以通过设置一些属性来实现:
将DiagramView.Behavior设置为Modify
将节点的HandlesStyle设置为MoveOnly
将ModificationStart设置为AutoHandles
您还可以将其实现为自定义行为类,也可以从StartDraw方法返回
return new InteractionState(currentItem,8,Action.Modify);
return new InteractionState(fc.Selection,-1,Action.Create);
return new InteractionState(fc.Selection,8,Action.Modify);
8是动作调整句柄的索引,当Action设置为Modify时使用。当操作为“创建”时,将忽略该索引。您可以将Behavior派生类的实例分配给DiagramView.CustomBehavior属性。
问:我正在寻找最简单的方法来动态更改节点上的链接锚点,以便锚点最接近连接节点。如果目标节点位置发生更改,我不希望链接跨越源节点。
答:检查链接在启用其动态属性时的工作方式。它会使链接在拖动节点时更改其原点和目标连接点。
(MindFusion.Diagramming for WinForms现已加入在线订购,点击查看价格~)
问:有没有办法在每个表或每个单元格的基础上控制文本编辑?我们有一些表格,我们不希望任何就地编辑和其他我们只想允许就地编辑单元格值而不是标题...
答:您可以通过处理Diagram.NodeTextEditing和Diagram.CellTextEditing事件来实现。将e.Cancel设置为true可防止用户编辑节点的文本。
问:如何使用鼠标滚轮滚动或缩放图表?
答:您可以使用鼠标滚轮添加滚动支持,如下所示:
private void Form1_Load(object sender,
System.EventArgs e)
{
diagramView.MouseWheel +=
new MouseEventHandler(diagramView_MouseWheel);
}
void diagramView_MouseWheel(object sender,
MouseEventArgs args)
{
diagramView fcSender = sender as diagramView;
float newScrollY = fcSender.ScrollY - args.Delta / 50;
if (newScrollY > fcSender.DocExtents.Top)
fcSender.ScrollY = newScrollY;
}
此事件继承自Control类,但由于某种原因,它不会出现在IDE的事件列表中。您必须手动为其添加处理程序。上面的处理程序滚动文档,但如果您愿意,可以通过更改DiagramView.ZoomFactor属性来更改它以放大/缩小。
问:我想选择图表中的所有内容并将选择向下移动一定量的dx和dy。有没有办法轻松移动整个选择?
答:移动节点也会移动链接端点,因此最简单的解决方案是将所有项目分两个阶段移动。首先,移动所有选定的节点 - 这也会抵消链接的端点。接下来,偏移所有选定链接的所有控制点,除了端点(端点已随节点移动)。
问:我正在使用ControlNode对象,我有一个TextEditor。如何在调整大小和移动时进行绘画?
答:只有当消息队列中没有任何其他消息时,Windows才会向控件发送WM_PAINT消息,因此在您暂停移动鼠标之前不会重新绘制托管控件。您可以通过从NodeModifying事件处理程序调用其Refresh方法来强制托管控件重新绘制自己。
问:我将FlowChart的区域划分为4个车道。左键单击RowHeaders时是否有任何事件?
答:您可以处理Clicked事件并调用GetHeaderFromPoint方法以查明是否已单击某些标头。
问:有没有办法限制形状节点接受并允许的链接数量?
答:您可以处理LinkCreating和LinkModifying验证事件,并根据连接到节点的链接数允许或阻止操作。
问:有没有办法限制可添加到图表中的特定类型的形状节点数?
答:如果图中有超过一定数量的节点,则处理NodeCreating事件并设置e.Cancel = true。
问:如何防止用户在图表中创建周期?
答:这是一种简单的方法:
private void diagram_LinkModifying(object sender,
MindFusion.Diagramming.LinkValidationEventArgs e)
{
if (e.ChangingOrigin || e.ChangingDestination)
{
PathFinder finder =
new PathFinder(diagram, false);
if (finder.FindShortestPath(
e.Destination, e.Origin) != null)
e.Cancel = true;
}
}
private void diagram_LinkCreating(object sender,
MindFusion.Diagramming.LinkValidationEventArgs e)
{
PathFinder finder =
new PathFinder(diagram, false);
if (finder.FindShortestPath(
e.Destination, e.Origin) != null)
e.Cancel = true;
}
问:在我的图中,两个节点重叠。当我点击重叠区域时,我希望始终选择相同的节点。有没有办法优先考虑我想要选择的节点?
答:为具有更高优先级的节点分配更大的ZIndex值。仅在单击节点时,调用GetNodesAt以查找鼠标位置的所有节点,并以编程方式选择其中一个节点。
问:我希望在移动节点时,连接到节点的链接的头部或基部围绕节点的边界移动,就像FlowChart.NET演示(链接 - >表单保留)中的一个示例一样。我将属性RetainForm设置为true。但是,这还不够......我必须设置的正确属性是什么?
答:尝试将DiagramLink.Dynamic设置为true,这是在移动节点时更新链接终点位置的属性。启用RetainForm也可以更新中间控制点的位置,以便保留链接的初始形状。如果启用了AutoRoute,则可能会忽略RetainForm。
问:如何使用户能够从一个表到另一个表(而不是同一行)创建多个链接?
答:将Diagram.AllowLinksRepeat设置为true将启用该功能。
问答持续更新中>>>