2008-08-24 4 views
9

Ich umschreibe eine alte Anwendung und nutzen Sie dies als eine gute Gelegenheit, um C# und .NET-Entwicklung (ich mache normalerweise viele Plug-in-Zeug in C).Erstellen C# .NET Windows-Anwendung mit mehreren Ansichten

Die Anwendung ist im Grunde ein Timer zum Sammeln von Daten. Es hat eine Startansicht mit einer Schaltfläche, um die Messung zu starten. Während der Messung hat die App fünf verschiedene Ansichten, abhängig davon, welche Informationen der Benutzer sehen möchte.

Wie können Sie am besten zwischen den Ansichten wechseln? Vom Start bis zum Laufen? Zwischen den laufenden Ansichten?

Ideen:

  • Verwenden Sie eine Form und verstecken und zeigen Kontrollen
  • Verwenden Sie eine Startmaske und dann ein Formular mit einem Formen TabControl
  • Verwenden sechs separate Formen

Antwort

7

Das Erstellen einer Reihe von überlagerten Panels ist ein Design-Zeit-Albtraum.

Ich würde vorschlagen, ein Tab-Steuerelement mit jeder "Ansicht" auf einer separaten Registerkarte, und dann die richtige Registerkarte zur Laufzeit auswählen. Sie vermeiden können, die Registerkarte Header zeigt, die von Load-Ereignis in Ihrem Formular ist so etwas wie dies setzen:

tabControl1.Top = tabControl1.Top - tabControl1.ItemSize.Height; 
tabControl1.Height = tabControl1.Height + tabControl1.ItemSize.Height; 
tabControl1.Region = new Region(new RectangleF(tabPage1.Left, tabPage1.Top, tabPage1.Width, tabPage1.Height + tabControl1.ItemSize.Height)); 
+0

wenn die tabcontrol ‚füllen‘ in einem anderen Behälter angeschlossen ist, und wenn Sie diesen Container Größe ändern, nicht mehr die Registerkarte dockt an den übergeordneten Container füllen, wenn Sie den obigen Code verwenden. Nur zu deiner Information. Vielen Dank – SomethingBetter

3

Tabbed sind normalerweise gut ... aber nur, wenn Sie möchten, dass der Benutzer zu jeder Zeit eine beliebige Ansicht sehen kann ... und es klingt, als ob Sie es nicht könnten.

Getrennte Formen funktioniert definitiv, aber Sie müssen sicherstellen, dass der Schalter istlos ... Wenn Sie sicherstellen, dass das neue Formular die gleiche genaue Größe und Position des alten Formulars erscheint, wird es wie es für dasselbe aussehen mit wechselnden Kontrollen.

Die Methode, die ich oft verwende, besteht eigentlich darin, alle meine Steuerelemente auf einzelne "Panel" -Steuerelemente vor-einzurichten und diese Panels dann anzuzeigen und auszublenden, wie ich sie brauche. Das "Panel" -Steuerelement ist im Grunde genommen ein Steuercontainer ... Sie können das Panel bewegen und alle Bedienelemente auf ihm bewegen sich relativ zueinander. Und wenn Sie das Panel ein- oder ausblenden, machen die Bedienelemente dasselbe. Sie sind großartig für Situationen wie diese.

1

Die Methode, die ich häufig verwenden ist eigentlich zu Vorrüstbereich alle meine Kontrollen auf einzelnen „Panel“ Kontrollen und dann zeigen und verstecken diese Tafeln, wie ich sie benötigen.

Anstatt jede Ansicht zu einem Panel innerhalb eines einzelnen Formulars zu machen, können Sie jede Ansicht zu einem UserControl machen. Erstellen Sie dann ein einzelnes Formular und schreiben Sie Code, um das richtige UserControl im Formular zu erstellen und anzuzeigen und von einem zum nächsten zu wechseln. Dies wäre einfacher zu verwalten, da Sie für jede Ansicht eine separate Klasse anstelle einer einzelnen Form-Klasse mit jeweils sechs Feldern mit eigenen Steuerelementen haben - das scheint schwierig und fehleranfällig zu sein.

7

Was ich tue, ist ein Panel haben, wo Ihre unterschiedlichen Ansichten werden Setz dich auf das Hauptformular. erstellen Sie dann Benutzersteuerelemente für Ihre verschiedenen Ansichten.

Wenn ich dann zwischen a'view 'wechseln will, docken Sie es an Panel auf dem Hauptformular .. Code sieht ein wenig so aus.

ich bevorzuge das, weil Sie dann Ihre Ansichten wiederverwenden können, wie wenn Sie eine Ansicht in einer Registerkarte öffnen möchten, können Sie Ihre Benutzersteuerelemente in Registerkarten andocken oder sogar erben von Tabpage anstelle von usercontrol, Dinge zu machen ein bisschen mehr Generika

public partial class MainForm : Form 
{ 
    public enum FormViews 
    { 
     A, B 
    } 
    private MyViewA viewA; //user control with view a on it 
    private MyViewB viewB; //user control with view b on it 

    private FormViews _formView; 
    public FormViews FormView 
    { 
     get 
     { 
      return _formView; 
     } 
     set 
     { 
      _formView = value; 
      OnFormViewChanged(_formView); 
     } 
    } 
    protected virtual void OnFormViewChanged(FormViews view) 
    { 
     //contentPanel is just a System.Windows.Forms.Panel docked to fill the form 
     switch (view) 
     { 
      case FormViews.A: 
       if (viewA != null) viewA = new MyViewA(); 
       //extension method, you could use a static function. 
       this.contentPanel.DockControl(viewA); 
       break; 
      case FormViews.B: 
       if (viewB != null) viewB = new MyViewB(); 
       this.contentPanel.DockControl(viewB); 
       break; 
     } 
    } 

    public MainForm() 
    { 

     InitializeComponent(); 
     FormView = FormViews.A; //simply change views like this 
    } 
} 

public static class PanelExtensions 
{ 
    public static void DockControl(this Panel thisControl, Control controlToDock) 
    { 
     thisControl.Controls.Clear(); 
     thisControl.Controls.Add(controlToDock); 
     controlToDock.Dock = DockStyle.Fill; 
    } 
} 
Verwandte Themen