Discussion:
WPF: Dialoge vor der eigentlichen App öffnen
(zu alt für eine Antwort)
Michaela Meier
2007-09-27 10:51:33 UTC
Permalink
Hallo,

Ich steh hier total auf dem Schlauch.
Ich versuche in WPF etwas zu erreichen, was ich schon seit VB3-Zeiten mit
ein paar simplen Handgriffen in der "Sub Main" bewerkstellige: Vor dem Start
des eigentlichen Hauptfenster soll z.B. ein Login erfolgen und/oder eine
Konfiguration vorgenommen werden.
Es kann sogar sein, daß sich nach einem Login überhaupt erst entscheidet,
welches Fenster das Hauptfenster sein soll - ein Admin bekommt eine ganz
andere Oberfläche zu sehen als ein normaler Benutzer. Es hilft also nicht
viel, diese ganzen Abfragen in den Start "des" Hauptfensters zu packen.

Auch in VS 2005 scheint das alles kein Problem zu sein.

static void Main ()
{
Application.EnableVisualStyles ();
Application.SetCompatibleTextRenderingDefault (false);

Form2 frmLogin = new Form2 ();
DialogResult rLogin = frmLogin.ShowDialog ();
frmLogin.Dispose();
if (rLogin != DialogResult.OK) {
//rauswurf
return;
}

Form3 frmFolder = new Form3 ();
DialogResult rFolder = frmFolder.ShowDialog ();
frmFolder.Dispose();
if (rFolder !=DialogResult.OK) {
//rauswurf
return;
}

// ... usw ...

// der User hat's doch bis hierhin geschafft
Application.Run (new Form1 ());
}


In WPF versuche ich mich wie in MSDN beschrieben in die App.xaml
einzuklinken.
Und zwar mit
<Application ...... Startup="StartUp">
und

public partial class App : Application
{
public void StartUp(object sender, StartupEventArgs e)
{
Window2 frmLogin = new Window2 ();
bool? rLogin = frmLogin.ShowDialog ();
if ((bool) !rLogin) {
//rauswurf
return;
}

Window3 frmFolder = new Window3 ();
bool? rFolder = frmFolder.ShowDialog ();
if ((bool) !rFolder) {
//rauswurf
return;
}

// ... usw ...

// der User hat's doch bis hierhin geschafft
Window1 frmMain=new Window1();
frmMain.Show();
}
}


Bei der Anzeige von Window1 werde ich jedoch wahlweise beschimpft
("Unbekanntes URI-Präfix") oder Initialize wird zwar aufgerufen, aber das
Fenster wird nicht angezeigt und die Applikation still und heimlich (ohne
Fehlermeldung) beendet.
Es ist mir auch unmöglich, einen Dialog ein zweites Mal anzuzeigen (z.B. um
ein fehlgeschlagenes Login zu wiederholen). Dann erhalte ich ebenfalls
"Unbekanntes URI-Präfix".

Kann mir mal bitte jemand beim Dämonen austreiben helfen? Das muß doch
irgendwie lauffähig zu bekommen sein :-)

Michaela
Karlheinz Godo
2007-09-27 19:48:14 UTC
Permalink
Hallo Michaela!

Ich nehme mal an, dass bei dir Window1, Window2, und Window3 alle
vom selben Klassentyp: Window Class sind? Richtig?

Wenn dem so ist, muß die Instanzierung (new Window) deines Main Fenster vor
der Instanzierung deiner Dialog Fenster erfolgen. Warum das so ist, steht
in der MSDN: About Window Class.
Post by Michaela Meier
Bei der Anzeige von Window1 werde ich jedoch wahlweise beschimpft
("Unbekanntes URI-Präfix")
Die Angabe Startup und StartupUri in XAML kannst du dir sparen, wenn du
im Code OnStartup überschreibst.

Grüsse - Karlheinz
Michaela Meier
2007-10-01 07:43:23 UTC
Permalink
Post by Karlheinz Godo
Die Angabe Startup und StartupUri in XAML kannst du dir sparen, wenn du
im Code OnStartup überschreibst.
Hallo,

Inzwischen habe ich den Code so weit, daß der Aufruf ohne Fehlermeldung
möglich ist.

Window1 frmMain = new Window1();
Window2 frmLogin = new Window2();
bool? loginOk = frmLogin.ShowDialog();
if ((bool) loginOk)
{
MessageBox.Show("Du bist drin.");
frmMain.Show();
} else {
MessageBox.Show("Geh weg!");
}

Nur bleibt hier das klitzekleine Problem, daß die App nicht automatisch
geschlossen wird, wenn das Login fehlschlägt.
Ich nehme an, daß es daran liegt, daß das Fenster frmMain zwar deklariert,
aber nicht aufgerufen und damit auch nicht vom Benutzer geschlossen werden
konnte.
Ich muß es aber deklarieren, bevor das Login-Fenster geöffnet wird, da sonst
wieder entweder der Fehler "Visibility kann nicht festgelegt oder Show bzw.
ShowDialog aufgerufen werden, nachdem das Fenster geschlossen wurde." oder
eben "Unbekanntes URI-Präfix." auftritt.

Dispose() scheint es unter WPF nicht mehr zu geben ... wie werde ich also
das Fenster los?
Oder muß ich die App "hart" beenden?

Michaela
Karlheinz Godo
2007-10-02 14:30:44 UTC
Permalink
Post by Michaela Meier
Window1 frmMain = new Window1();
wie werde ich also das Fenster los?
frmMain.Close() funktioniert nicht?
Michaela Meier
2007-10-05 09:54:54 UTC
Permalink
Post by Karlheinz Godo
Post by Michaela Meier
Window1 frmMain = new Window1();
wie werde ich also das Fenster los?
frmMain.Close() funktioniert nicht?
Doch, das funktioniert... aber da muß man erstmal drauf kommen, daß man eine
Form, die man niemals geöffnet hat, durch Close entladen muß *seufz*
Loading...