Form ZOrder Problem

08/01/2010 - 09:16 von Heiko Müller | Report spam
Hallo,

ich habe ein kleines Problem, bei dem ich nicht weiterkomme:

In meiner Anwendung (Hauptform: Shell) kann ich via Menü ein weiteres,
nichtmodales Fenster öffnen (Anzeige via formHelp.Show()). Dieses zweite
Fenster kann der Benutzer permanent zum Hauptfenster geöffnet lassen
(Hintergrund: es handelt sich um eine eigene Lösung zur Anzeige einer
'OnlineHilfe').

Nun öffnet der Benutzer aus der Shell heraus ein Dialogfenster, welches
via ShowDialog(shell) modal angezeigt wird. In diesem Dialogfenster gibt
es eine Schaltflàche 'Hilfe', die wiederum im bereits geöffneten Fenster
für die Online-Hilfe das entsprechende Thema aufrufen und anzeigen soll
(formHelp.ShowTopic(topic)). Das funktioniert auch alles wie gewünscht,
aber leider làsst sich das Hilfefenster (formHelp) danach nicht
bedienen, da es in der ZOrder der Forms offensichtlich hinter dem Dialog
liegt. Erst wenn der Dialog geschlossen wird, wird auch das Hilfefenster
wieder benutzbar.

Alle Versuche, das Hilfefenster via BringToFront oder SetWindowPos 'vor'
das Dialogfenster zu bringen scheiterten bis jetzt (blieben ohne
Auswirkung).

Hat jemand 'zufàllig' eine Idee, wie man das lösen könnte?

Gruß und vielen Dank schonmal,

Heiko Müller
 

Lesen sie die antworten

#1 Frank Dzaebel
08/01/2010 - 20:22 | Warnen spam
Hallo Heiko,

Nun öffnet der Benutzer aus der Shell heraus ein Dialogfenster, welches
via ShowDialog(shell) modal angezeigt wird. [...]
aber leider làsst sich das Hilfefenster (formHelp) danach nicht
bedienen, [...] Erst wenn der Dialog geschlossen wird ...



Also das ist zunàchst "by design" so bei modalen Fenster,
die eben erzwingen sollen, dass sie bzgl. der zugehörigen
Applikation erst bearbeitet und eben dann geschlossen werden
sollen, bevor ein Weiterarbeiten in anderen App-Formen wieder
möglich sein soll.

Mögliche Lösung ... : Du könntest zum Beispiel
bevor ich's mit Worten erklàre vielleicht besser als
grober Pseudo-Code-Ansatz:

//==// HauptForm.cs:
// ...
public partial class HauptForm : Form
{
public HauptForm(){ InitializeComponent();}

static public HilfeForm HilfeFormInstanz;
static public Rectangle HilfeBounds;

private void btnHilfe_Click(object sender, EventArgs e)
{
HilfeFormInstanz = new HilfeForm();
HilfeFormInstanz.Show();
}

private void btnModal_Click(object sender, EventArgs e)
{
HilfeBounds = Rectangle.Empty;
if (HilfeFormInstanz != null)
{
HilfeBounds = HilfeFormInstanz.Bounds;
HilfeFormInstanz.Close();
}
ModaleForm mf = new ModaleForm();
mf.HilfeBounds = HilfeBounds;
DialogResult res = mf.ShowDialog(this);
mf.Dispose();
}
}


// // ModaleForm.cs:
// ...
public partial class ModaleForm : Form
{
public ModaleForm(){InitializeComponent();}

public Rectangle HilfeBounds { get; set; }

private void ModaleForm_Load(object sender, EventArgs e)
{
if (HilfeBounds == Rectangle.Empty) return;
HilfeForm hf = new HilfeForm();
hf.Show(); hf.Bounds = HilfeBounds;
HauptForm.HilfeFormInstanz = hf;
}
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen