2008-08-06 10 views
13

Ich schreibe eine Anwendung, die im Grunde nur ein Einstellungsdialog ist, ähnlich wie der Dialog für die Baumansicht, den Visual Studio selbst verwendet. Die Funktion der Anwendung ist einfach eine Durchleitung für Daten von einem seriellen Gerät zu einer Datei. Es führt viele, viele Transformationen an den Daten durch, bevor es in die Datei geschrieben wird, so dass die GUI für die Anwendung einfach all die Einstellungen sind, die bestimmen, was diese Transformationen sein sollen.Wie erstellt man in C# einen Baumansicht-Voreinstellungdialog?

Was ist der beste Weg zum Entwerfen/Kodieren eines Baumansicht-Einstellungsdialogs? Die Art, wie ich darüber gegangen bin, baut das Hauptfenster mit einem angedockten Baum-Steuerelement auf der linken Seite. Dann habe ich Container-Steuerelemente erstellt, die jedem Knoten des Baums entsprechen. Wenn ein Knoten ausgewählt ist, bringt die App das entsprechende Container-Steuerelement dieses Knotens nach vorne, verschiebt es an die richtige Position und maximiert es im Hauptfenster. Dies scheint wirklich, wirklich klobig beim Entwerfen. Das bedeutet im Grunde genommen, dass ich während der Entwurfszeit Tonnen von Containersteuerelementen über den Rand des Hauptfensters hinaus habe, damit ich das Hauptfenster weiter scrollen muss, um mit ihnen zu arbeiten. Ich weiß nicht, ob dies völlig den Weg macht Sinn, ich dies schreibe, aber vielleicht diese visuelle für das, was ich rede wird über mehr Sinn machen:

form design

Im Grunde habe ich damit arbeiten riesige Form, mit Containersteuerungen überall, und dann eine Reihe von Laufzeit Neuformatierung, um alles zu arbeiten. Dies scheint wie ein Los der zusätzlichen Arbeit. Mache ich das auf eine total dumme Weise? Gibt es einen "offensichtlichen" einfacheren Weg, den ich vermisse?

Antwort

10

Eine aufgeräumter Weise getrennte Formen für jeden ‚pane‘ und in jeder Form Konstruktor zu erstellen, stellen Sie

this.TopLevel = false; 
this.FormBorderStyle = FormBorderStyle.None; 
this.Dock = DockStyle.Fill; 

Auf diese Weise jede dieser Formen im eigenen Designer werden kann, instanziiert einer gelegt oder mehrmals zur Laufzeit, und wie ein normales Steuerelement zum leeren Bereich hinzugefügt.

Vielleicht könnte die Hauptform eine SplitContainer mit einer statischen TreeView in einem Panel und Raum, um diese Formulare in den anderen hinzuzufügen. Sobald sie hinzugefügt wurden, konnten sie unter Verwendung der Methoden oder BringToFront/SendToBack durchgeblättert werden.

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show(); 
2

Greg Hurlman schrieb:

Warum nicht einfach zeigen/den richtigen Behälter verstecken, wenn ein Knoten im Netz ausgewählt wird? Lassen Sie die Container alle an der gleichen Stelle richtig dimensionieren und verstecken Sie alle außer dem Standard, der beim Laden im Raster vorgewählt wird.

Leider versuche ich das zu vermeiden. Ich suche nach einer einfachen Möglichkeit, die Schnittstelle während der Entwurfszeit zu handhaben, mit minimalem Neuformatierungscode, der benötigt wird, um während der Laufzeit zu funktionieren.

Ich mag Duncan's Antwort, weil es bedeutet, dass das Design der einzelnen Knotenschnittstelle vollständig getrennt gehalten werden kann. Dies bedeutet, dass ich keine Überschneidung mit den Fangrichtlinien und anderen Designzeitvorteilen bekomme.

0

Ich würde wahrscheinlich mehrere Panel-Klassen basierend auf einer Basisklasse erstellen, die CustomControl erbt. Diese Kontrollen würden dann Methoden wie Speichern/Laden und ähnliches haben. Wenn ja, kann ich jedes dieser Paneele separat gestalten.

Ich habe ein Wizard-Steuerelement verwendet, das im Entwurfsmodus mehrere Seiten bearbeitet hat, so dass man im Designer auf die nächste Seite klicken und alle Seiten auf einmal durch den Designer entwerfen konnte. Obwohl dies mehrere Nachteile bei der Verbindung von Code mit den Steuerelementen hatte, bedeutet dies wahrscheinlich, dass Sie eine ähnliche Konfiguration haben könnten, indem Sie einige Designer-Klassen erstellen. Ich habe selbst noch keine Designer-Kurse in VS geschrieben, also kann ich nicht sagen, wie oder ob es sich lohnt :-)

Ich bin ein wenig neugierig darauf, wie Sie mit dem Laden/Speichern von Werten umgehen wollen/von den Kontrollen? In einer Klasse muss es viel Code geben, wenn alle Ihre Seiten in einer großen Form vorliegen?

Und noch ein anderer Weg wäre natürlich, den GUI-Code zu generieren, wie jede Seite angefordert wird, mit Informationen darüber, welche Art von Einstellungen es gibt.

Verwandte Themen