F: Wird ein Event gestartet, wenn eine Form bewegt wird? Wir pflegen einige Zustände, die mit der Position der Formen zusammenhängen, und wir müssen daher wissen, wenn diese bewegt werden?
A: Das NodeModified Ereignis wird ausgelöst, wenn ein Knoten bewegt oder seine Größe geändert wird. Prüfen Sie das AdjustmentHandle Ereignis-Argument, um genau herauszufinden, was passiert ist. Wenn es gleich AdjustmentHandles.Move ist, dann wurde der Knoten bewegt.
Zurück zum Anfang
F: Wie kann man das FlowChart.NET Control als Drop-Ziel anwenden? Ich setze AllowDrop = true für die Instanz des DiagramView Controls in meiner Form. Es sieht so aus (nach dem Verhalten des Mauspfeils), dass das Control nicht auf das Drop-Ziel reagiert. Was kann ich tun?
A: Sie müssen auch die DragOver und DragDrop Events bearbeiten:
diagramView_OnDragOver...
{
// für Maus Feedback
e.Effect = DragDropEffects.Copy;
}
diagramView_OnDrop...
{
// Erhalte hinzugezogene Daten und füge diese
// dem Diagramm zu, wie dies benötigt wird
Zurück zum Anfang
F: Kann ich ResizeToFitItems jedes Mal ausführen, wenn ein Element im Diagramm bewegt wird?
A: Sie können die Eigenschaft Diagram.AutoResize anstelle von ResizeToFitItems als Antwort auf den Event-Handler aktivieren.
Zurück zum Anfang
F: Wie funktioniert das Event SelectionMoved? Ist SelectionMoved anwendbar für ein einzelnes Element oder nur für 2 oder mehr selektierte Elemente? Gibt es ein anderes Ereignis oder eine Eigenschaft für den Fall, wenn ein einzelnes Objekt selektiert wird?
A: SelectionMoved wird nur für Mehrfach-Auswahl ausgelöst. Sie sollten andere Ereignisse, wie z.B. NodeModified und LinkModified behandeln, wenn Sie die Modifizierung eines einzelnen Items erkennen möchten.
Zurück zum Anfang
F: Wie kann man Doppelklicke auf einer Tabellenreihe feststellen? Das Ereignis NodeDoubleClicked scheint nur ausgelöst zu werden, wenn der Tabellentitel angeklickt wird, und nicht die Tabellen-Reihen. Welches Ereignis kann angewendet werden, wenn ein beliebiger Teil der Tabelle angeklickt wird?
A: Behandeln Sie CellDoubleClicked, das ausgelöst wird, wenn eine Tabellenzelle doppelt geklickt wird. Mithilfe der Row-Eigenschaft der Zelle bestimmen Sie, welche Reihe angeklickt wurde.
Zurück zum Anfang
F: Wie soll ich Drag & Drop von einem ListView oder TreeView Control zu dem FlowChart Control realisieren?
Hier ist die Vorgehensweise:
Der Nutzer selektiert einen Baumknoten in dem Treeview Control, und dann zieht ihn über das FlowChart Control. Während des Ziehens über das FlowChart Control, sieht der Drag-Cursor wie eine Textbox aus. Nach dem Droppen soll eine Textbox in dem FlowChart Control erscheinen.
A: Sie können dies erreichen, indem Sie Control.DoDragDrop von dem TreeView.MouseDown Event-Handler aufrufen, und den Knoten in dem Event DiagramView.DragDrop erstellen. Sehen Sie sich das ListView in dem Beispielprojekt Flowcharter, und einen der "Miscellaneous" Schritte des Beispiels "FCDemo" an.
Zurück zum Anfang
F: Wie kann man die Text-Editierung einiger Knoten verhindern, wenn AllowInplaceEdit aktiviert wurde?
A: Es gibt ein Validierungsereignis Diagram.NodeTextEditing, das beim Doppelklicken eines Knotens ausgelöst wird. Setzen Sie e.Cancel auf true, um die Text-Editierung einiger Knoten zu unterbinden.
Zurück zum Anfang
F: Wie kann man Verbindungen zwischen Knoten zeichnen? Ich habe die Behavior-Eigenschaft des DiagramView-Objekts auf DrawLinks gesetzt, aber beim Ziehen von Knoten zu Knoten geschieht nur Selektieren der zwei Knoten, und keine Verbindung wird dazwischen gezeichnet. Welche Einstellung beeinflusst dieses Verhalten?
A:> Überprüfen Sie Diagram.AllowUnanchoredLinks und DiagramNode.AllowOutgoingLinks. Wenn Sie die Erstere desaktiviert haben, können Sie Verbindungen nur von Knoten zeichnen, deren AnchorPattern eingestellt wurde.
Zurück zum Anfang
F: Wie soll ich folgendes Diagrammverhalten realisieren? Ich erzeuge Diagramme mit Knoten-Bildern, und möchte, dass der Nutzer im Stande ist, mit einem einzelnen Klick Knoten bewegen zu starten. Außerdem soll es dem Nutzer nicht erlaubt sein, neue Items zu erstellen, und die Größe von gezeichneten Items zu verändern. Soll ich ein Objekt mit Custom-Behavior dafür erstellen?
A: Dies kann durch Einstellung einiger Eigenschaften implementiert werden:
Sie können dies auch als Custom-Behavior Klasse implementieren, in die Sie von der StartDraw Methode die Argumente über eine der Anweisungen übergeben
- return new InteractionState(currentItem, 8, Action.Modify);
- return new InteractionState(fc.Selection, -1, Action.Create);
- return new InteractionState(fc.Selection, 8, Action.Modify);
Der Index 8 ist für die Bewegung des Knotens bestimmt, und wird angewendet, wenn Action auf Modify eingestellt wurde. Der Index wird für Action.Create ignoriert. Sie können eine Instanz Ihrer von Behavior abgeleiteten Klasse der Eigenschaft DiagramView.CustomBehavior zuweisen.
Zurück zum Anfang
F: Ich suche die einfachste Methode zur dynamischen Änderung der Links-Ankerpunkte an einem Knoten, so dass der Anker am nächsten zu dem Verbindungsknoten ist. Ich möchte, dass sich die Links über den Eingangsknoten nicht kreuzen, wenn die Position des Zielknotens geändert wird.
A: Prüfen Sie, wie sich Verbindungen verhalten, wenn deren Dynamic Eigenschaft aktiv ist. Die Verbindungen werden deren Ursprungs- und Zielpunkte ändern, wenn ein Knoten herumgezogen wird.
Zurück zum Anfang
F: Wie kann man, den in einer einzelnen Tabelle oder Zelle enthaltenen Text direkt editieren? Wir haben einige Tabellen, an denen wir keine Veränderungen erlauben und andere, an denen wir lediglich die direkte Text-Editierung der Zellen-Werte ohne die Beschriftung erlauben möchten.
A: Sie können dies mittels der Events Diagram.NodeTextEditing und Diagram.CellTextEditing erreichen. Setzen Sie e.Cancel auf "true", um die Text- Editierung zu verhindern.
Zurück zum Anfang
F: Wie kann ich mit dem Mausrad im Diagramm scrollen und zoomen?
A: Sie können das Scrolling mit dem Mausrad folgendermaßen implementieren:
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;
}
Dieses Event wird von der Control-Klasse vererbt, ist aber in der IDE-Liste nicht sichtbar. Sie müssen selbst einen Handler hinzufügen. Der hier angegebene Handler scrollt das Dokument. Wenn Sie es wünschen, können Sie dies auf Zoom-In/Zoom-Out umstellen, indem Sie die Eigenschaft DiagramView.ZoomFactor verändern.
Zurück zum Anfang
F: Ich möchte alles in dem Diagramm selektieren und die Selektierung abwärts für einen bestimmten Betrag von dx und dy verschieben. Gibt es eine Möglichkeit, die gesamte Selektierung leicht zu verschieben?
A: Bei dem Verschieben eines Knotens werden auch die Endpunkte der Verbindung verschoben, so dass die einfachste Lösung das Verschieben aller Items in zwei Phasen ist. Zuerst verschieben Sie alle selektierten Knoten - dabei werden auch die Endpunkte der Verbindungen versetzt. Dann versetzen Sie alle Kontrollpunkte von allen selektierten Verbindungen, ausgenommen die Endpunkte (die Endpunkte wurden mit den Knoten verschoben).
Zurück zum Anfang
F: Ich verwende ein ControlNode-Objekt, in dem ich einen TextEditor habe. Wie kann ich Neuzeichnen während Größenänderung und Verschiebung realisieren?
A: Windows sendet WM_PAINT Nachrichten zu Kontrollen, nur wenn es keine anderen Meldungen in der Nachrichtenschlange gibt, so dass das gehostete Steuerelement nicht neu gezeichnet wird, bevor Sie aufhören, die Maus zu bewegen. Sie können das Neuzeichnen des Hosted Controls durch den Aufruf seiner Refresh Methode von dem NodeModifying Event-Handler hervorrufen.
Zurück zum Anfang
F: Ich habe die FlowChart Fläche in 4 Lanes aufgeteilt. Gibt es ein Ereignis, das bei einem Linksklick auf RowHeaders auftritt?
A: Sie können das Ereignis Clicked behandeln und die Methode GetHeaderFromPoint aufrufen, um herauszufinden, ob ein Header angeklickt wurde.
Zurück zum Anfang
F: Gibt es eine Möglichkeit, die Anzahl der ein- und ausgehenden Verbindungen zu beschränken, die ein Knoten akzeptieren soll?
A: Sie können die Validierungsereignisse LinkCreating und LinkModifying behandeln und die Operation erlauben oder unterbinden je nachdem wieviel Verbindungen mit dem Knoten verbunden sind.
Zurück zum Anfang
F: Gibt es eine Möglichkeit, die Anzahl der Knoten eines bestimmten Typs zu beschränken, die zu einem Diagramm zugefügt werden können?
A: Behandeln Sie das Ereignis NodeCreating und setzen Sie e.Cancel = true, wenn es mehr als eine bestimmte Anzahl von Knoten in dem Diagramm gibt.
Zurück zum Anfang
F: Wie kann man die Erstellung von Zyklen im Graph unterbinden?
A: Hier wird eine einfache Vorgehensweise gezeigt:
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;
}
Zurück zum Anfang
F: In meinem Diagramm überlappen zwei Knoten. Wenn ich die überlappte Fläche anklicke, will ich, dass immer derselbe Knoten selektiert wird. Gibt es eine Vorgehensweise, den Vorrang einem Knoten zu geben, den ich selektieren möchte?
A: Weisen Sie einen größeren ZIndex-Wert dem Knoten mit höherer Priorität zu. Nur zu der Zeit, wenn die Knoten angeklickt werden, rufen Sie GetNodesAt auf, um alle Knoten unter der Mausposition herauszufinden, und aktivieren Sie einen von denen programmatisch.
Zurück zum Anfang
F: Wenn ich einen Knoten bewege, möchte ich, dass der Kopf oder Fuß der mit dem Knoten verbundenen Link um den Knotenrand umgestellt wird, wie ein Beispiel in FlowChart.NET Demo zeigt (Links --> Form Preservation). Ich setze die Eigenschaft RetainForm auf true. Aber das ist nicht genug...welche ist die korrekte Eigenschaft, die ich einstellen muss?
A: Probieren Sie die Einstellung DiagramLink.Dynamic gleich true, das ist die Eigenschaft, die die Link-Endpunktpositionen aktualisiert, wenn ein Knoten bewegt wird. Aktivieren Sie RetainForm, um die Positionen der dazwischenliegenden Kontrollpunkte auch zu aktualisieren, so dass die Ursprungsform der Link aufbewahrt wird. RetainForm kann ignoriert werden, wenn AutoRoute aktiviert wird.
Zurück zum Anfang
F: Ich möchte es dem Nutzer erlauben, mehr als eine Verbindung von einer Tabelle zu einer anderen zu zeichnen (nicht von derselben Reihe)?
A: Die Einstellung Diagram.AllowLinksRepeat auf true wird dies ermöglichen.
Zurück zum Anfang
|