PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] Wie solch ein Gui umsetzen?


Holiday
2007-11-11, 20:06:34
Hallo erstmal,

ich habe vor, ein GUI wie folgt zu erstellen:

Beim starten der Anwendung öffnet sich ein Fenster, das einer Art Menü ähnelt.. links eine Navigation (dort sind Subprogramme auswählbar), in der Mitte eine Beschreibung dazu. Wähle ich nun ein Menüpunkt an (also ein Subprogramm), soll sich der gesamte Fensterinhalt neu gestalten, und zwar soll nun das Subprogramm darin geladen werden. Dieses enthält einen Link zurück zum Menü, damit man in ein anderes Subprogramm wechseln kann, sobald man die Arbeit abgeschlossen hat.

1.) Ist das überhaupt empfehlenswert so? Oder sollte man besser ein neues Fenster (ähnlich einem Popup) für das Subprogramm öffnen? Ein Vorteil wäre bei der ersten Variante, dass die Übersichtlichkeit erhalten bleibt, da zu einem Zeitpunkt nur ein Programm ausgeführt werden kann und man nicht ausversehen 10 Fenster öffnet.

2.) Wie kann man sowas umsetzen?


Danke schonmal


PS: mit "Subprogramm" meine ich einfach, dass dort ein bestimmter Programmabschnitt erscheint. Biespiel: ich wähle Textverarbeitung an, und es öffnet sich ein Textverarbeitungsmodul...ich klicke mich zurück zum Menü und wähle Formeleditor an, und mein Formeleditor kommt zum Vorschein etc...Dies sind aber keine externen .exe Dateien! sondern gehören schon zum Programm selbst, sind also fest eingebaute Module.

Monger
2007-11-11, 20:25:17
Neue Fenster sind imho immer problematisch. Sie können in den Hintergrund rutschen, sie sind schwer nebeneinander anzuordnen, sie machen es oftmals undurchsichtig welches Fenster jetzt eigentlich den Fokus hat...

So was ich aus deiner Beschreibung rauslesen kann, hört sich schon ganz gut an. Aber in solchen Fällen gilt: ein Bild sagt mehr als tausend Worte. Mit einer Skizze vor Augen sieht man meistens recht schnell ob das brauchbar ist oder nicht.

gr@fz@hL
2007-11-11, 21:33:37
Du könntest in der Form mehrere Panel aufziehen, die übereinander liegen und mit der Visible-Eugenschaft ein- und ausblenden, je nachdem, welcher Bereich ausgewählt wurde.

Allerdings bin ich Anfänger, deshalbweiß ich nicht, ob das der Königsweg wäre.

holiday
2007-11-11, 21:44:18
Hallo ihr beiden, Danke schonmal für eure Antwort.

@Monger: ich hoffe mal, du meintest mit Bild sowas hier:

http://www.bilder-space.de/show.php?file=sLc30dTD3RBTllD.png

@gr@fz@hL

Wäre ein Ansatz, muss ich mal durchdenken.

The_Invisible
2007-11-11, 21:51:20
unser hosting-administrationstool habe ich genauso gestaltet, nur das links die subprogramme immer anwählbar sind und der status beim wechsel nicht verloren geht.

die user finden es auch viel angenehmer wenn nicht immer etwas auf und zu geht.

mfg

TheGamer
2007-11-11, 22:36:44
Links dein Menue

Rechts ein Panel in dem du CustomControls andockst (Mock Mode FILL)

Oder du machst nur ein Panel und das Menue auch in ein CustomControl das auch im Panel per default geladen ist.

Ich wuerde dir aber raten immer das Menue links zu haben.


Fuer die Zukunft:
Menuelinks dynamisch erweiterbar + die Moeglichkeit alle moeglichen Controls in das Panel zu schmeissen + ein wenig Aufwand (1-2 Stunden) = Pluginmoeglichkeit ;)

Du machst dir ein Plugin und dein Tool frisst das, fuellt links das Menue mit dem Pluginnamen. Beim anklicken wird es rechts ins Panel geladen.

Du nennst ja ein Textverarbeitungsmodul als Beispiel -> Modul = Plugin. Stelle die Schnittstellen in einer ClassLib bereit und jeder kann "SubProgramme" fuer dein Programm schreiben wenn er nach deinen Regeln das Interface implementiert :)

Du hast die EXE mit dem Geruest + ein paar dlls die die SubProgramme beinhalten.

Dein Program laedt diese dlls und fuellt das menue etc.

Gast
2007-11-11, 23:10:43
@ Threadstarter


Wenn das Programm eine gute Usability haben sollte, dann sollte das Programm so aussehen:

http://developer.gnome.org/projects/gup/hig/2.0/images/controls-notebook-list.png
http://developer.gnome.org/projects/gup/hig/2.0/controls-notebooks.html

Links eine Liste aller möglichen Subprogramme und rechts dann das Fenster für das gerade aktive Subprogramm.

So macht man das richtig.

Am besten liest du dir mal das ganze Dokument hier durch, wer etwas bezüglich Usability drauf haben will für den ist dieses Dokument Goldwert:
http://developer.gnome.org/projects/gup/hig/2.0/index.html


Was da steht beschränkt sich übrigens nicht nur auf den Gnome Desktop, sondern vieles davon ist auch auf andere GUI Systeme übertragbar.

Monger
2007-11-12, 11:58:35
@Monger: ich hoffe mal, du meintest mit Bild sowas hier:

http://www.bilder-space.de/show.php?file=sLc30dTD3RBTllD.png

Jo, das sieht doch gut aus!
Die Software die ich hier gerade von der Firma her teste, hat sogar ein ganz ähnliches Layout.

Um so etwas umzusetzen, gibt es natürlich jetzt geschätzte 3 Millionen verschiedene Wege. Von Java kenne ich das her, dass es ein "CardLayout" gibt, was in das selbe Panel verschiedene Fenster einblenden kann, und dann immer auf Befehl hin umschaltet. So oder ähnlich wird das bei dir vermutlich auch laufen.

Gast
2007-11-12, 14:19:55
Ich würde mit UserControls über Reflection lösen. Bsp.:


public class Controller
{
private static Form _mainForm;
private static UserControl _currentControl;

public static Form MainForm
{
get
{
return _mainForm;
}
set
{
_mainForm = value;
}
}

public static UserControl CurrentControl
{
get
{
return _currentControl;
}
set
{
_currentControl = value;
}
}


public void LoadControl(string controlToCall)
{
LoadControl(controlToCall, null);
}

public void LoadControl(string controlToCall, object activationObject)
{
if (_currentControl != null)
{
_currentControl.Dispose();
_mainForm.Controls.Remove(_currentControl);
}

Type t = Type.GetType(controlToCall);
UserControl control = null;

if (activationObject != null)
control = (UserControl)System.Activator.CreateInstance(t, activationObject);
else
control = (UserControl)System.Activator.CreateInstance(t);

control.Width = _mainForm.Width;
control.Height = _mainForm.Height;
control.Location = new Point(0, _mainForm.MainMenuStrip.Height);
control.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));

_currentControl = control;

_mainForm.Controls.Add(control);
_mainForm.Update();
_currentControl.Focus();
}
}


Das neue Control lädst du dann z.B. mit:


Controller controller = new Controller();
controller.LoadControl("MeinUserControl");


oder


Controller controller = new Controller();
controller.LoadControl("MeinUserControl", MeinObjektFürDenCtor);

TheGamer
2007-11-12, 14:25:40
Ich würde mit UserControls über Reflection lösen. Bsp.:


public class Controller
{
private static Form _mainForm;
private static UserControl _currentControl;

public static Form MainForm
{
get
{
return _mainForm;
}
set
{
_mainForm = value;
}
}

public static UserControl CurrentControl
{
get
{
return _currentControl;
}
set
{
_currentControl = value;
}
}


public void LoadControl(string controlToCall)
{
LoadControl(controlToCall, null);
}

public void LoadControl(string controlToCall, object activationObject)
{
if (_currentControl != null)
{
_currentControl.Dispose();
_mainForm.Controls.Remove(_currentControl);
}

Type t = Type.GetType(controlToCall);
UserControl control = null;

if (activationObject != null)
control = (UserControl)System.Activator.CreateInstance(t, activationObject);
else
control = (UserControl)System.Activator.CreateInstance(t);

control.Width = _mainForm.Width;
control.Height = _mainForm.Height;
control.Location = new Point(0, _mainForm.MainMenuStrip.Height);
control.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));

_currentControl = control;

_mainForm.Controls.Add(control);
_mainForm.Update();
_currentControl.Focus();
}
}
Das neue Control lädst du dann z.B. mit:


Controller controller = new Controller();
controller.LoadControl("MeinUserControl");
oder


Controller controller = new Controller();
controller.LoadControl("MeinUserControl", MeinObjektFürDenCtor);


Das ist genau sowas wie ich oben schrieb ;) bzw ein Teil davon. Zumindest in der Art. Wobei das mit den Anchorn usw kann man sich alles ersparen.

Lad doch einfach die Controls in ein panel und mach ein dock fill.

Gast
2007-11-12, 14:26:45
Der MainForm Eigenschaft musst du natürlich noch beim Starten deiner Hauptform die Instanz selbiger zuweisen.

Gast
2007-11-12, 14:29:53
Das ist genau sowas wie ich oben schrieb ;) bzw ein Teil davon. Zumindest in der Art. Wobei das mit den Anchorn usw kann man sich alles ersparen.

Lad doch einfach die Controls in ein panel und mach ein dock fill.

Das war ja nur ein Beispiel. Das kommt dann auf die eigenen Präferenzen an, vielleicht möchte man ja die Controls nach bestimmten Kriterien positionieren.

TheGamer
2007-11-12, 14:42:23
Das war ja nur ein Beispiel. Das kommt dann auf die eigenen Präferenzen an, vielleicht möchte man ja die Controls nach bestimmten Kriterien positionieren.

Ja in der Tat, jedoch beziehe ich mich auf das Bild und den Vorschlägen von Invisible. Natuerlich kann man da tun was man will :)

holiday
2007-11-12, 18:17:58
Danke für eure Beteiligung!

Werde das Menü dann wohl immer Links angezeigt lassen, ist wohl komfortabler als so ein Zurück-Button. Das mit der Plugin-Sache hört sich auch ganz gut an. Das hier gepostete Gnome-Bild ist schon garnicht so schlecht, werde aber versuchen es etwas aufwendiger als schwarz auf weiß erscheinen zu lassen. Aber ist ja eh kosmetischer Natur und kommt zum Schluss :)