2010-09-17 21 views
5

Ich habe eine wpf-Anwendung und ich habe ein Anmeldefenster erstellt, das zum Erstellen der Verbindungszeichenfolge der Anwendung verwendet wird. Ich habe Probleme, den ersten Dialog zu schließen und die MainWindow dahinter zu öffnen. Ich denke, ein nahes Ereignis sprudelt aus dem Anmeldedialog und bleibt im MainWindow stecken, denn sobald ich das MainWindow-Objekt im Codebehind erzeuge und Show() aufruft, bewegt es sich gerade nach meinem Startup-Ereignishandler und in meinen Konstruktor onClosing-Handler des MainWindow, ohne das Fenster selbst zu zeigen. Die app.xaml hat den ShutdownMode = "OnMainWindowClose" angegeben.wpf- Application_Startup - Ladedialogfenster THEN Hauptfenster

private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     try 
     { 
      Chooser thechooser = new Chooser(); 
      thechooser.ShowDialog(); 
     } 
     catch (Exception ex) 
     { 

     } 
     //initialize datalayer 
     dataLayer = new Mxxx41.DAL(this.CurrentConnectionString); 
     MainWindow appmainwindow = new MainWindow(); 
     Application.Current.MainWindow = appmainwindow; 
     appmainwindow.Activate(); 
     appmainwindow.Show(); 
} 

private void LogInButton_Click(object sender, RoutedEventArgs e) 
    { 
     //get ip from listbox selection 
     XmlElement currentelement = (XmlElement)Listbox.SelectedItem; 

     string ip = ((string)currentelement.Attributes["IP"].Value); 
     string instancename = string.Empty; 
     if (!((string)currentelement.Attributes["InstanceName"].Value == string.Empty)) 
     { 
      instancename = ((string)currentelement.Attributes["InstanceName"].Value); 
     } 
     //ping that IP 
     Boolean pingresult = ping.PingHost(ip); 
     Boolean sqlresult = false; 
     if (pingresult) 
     { 
      if (!(String.IsNullOrEmpty("instancename"))) 
      { 
       ip = string.Format("{0}\\{1}", ip, instancename); 
      } 

      //build connection string with that IP 
      string connstr = BuildConnStr(ip); 

      //create datalayer 
      Mxxx41.DAL datalayer = new Mxxx41.DAL(connstr); 
      //validate credentials 
      DataSet data = datalayer.getDataSet("login_checkcredentials", CommandType.StoredProcedure, datalayer.CreateParameter("@username", SqlDbType.VarChar, this.UsernameTextbox.Text), datalayer.CreateParameter("@password", SqlDbType.VarChar, this.PasswordTextbox.Text)); 
      if (data.Tables[0].Rows.Count > 0) 
      { 
       sqlresult = true; 

       //log in user 
       //build new user code omitted for brevity 


       App myAppReference = ((App)Application.Current); 
       myAppReference.CurrentUser = thisuser; 
       myAppReference.CurrentConnectionString = connstr; 
       //close window 
       this.Close(); //this is the close event I think is causing issues. 
      } 

     } 
     else 
     { 
      ErrorLabel.Content = string.Format("{0}{1}", "could not ping selected Host :", ip); 
     } 

     //return true 


    } 

public MainWindow(){ 
     this.InitializeComponent(); 

     this.SideBarExpander.IsExpanded = true; 

     this.Loaded += onLoaded; 
     this.Closed += onClosed; 
     this.Closing += onClosing; 

     try 
     { 
      //this.DataLayer = ((Mxxx41.DAL)MyDemoApp.App.Current.Properties["DataLayer"]); 
      App myAppReference = ((App)Application.Current); 
      this.DataLayer = myAppReference.GetDataLayer(); 
     } 
     catch //catch everything for the moment 
     { 
      this.DataBaseConnectionError = true; 
     } 
     ExceptionList = new List<Error>(); 
    } 

Kann mir jemand mit diesem Verhalten helfen?

Antwort

4

Das Problem ist wahrscheinlich mit ShutdownMode="OnMainWindowClose". Wpf betrachtet das erste geöffnete Fenster als "Hauptfenster". In Ihrem Fall sieht wpf Ihr Anmeldefenster als Hauptfenster und beendet Ihre Anwendung beim Schließen.

Versuchen Sie, den Abschaltmodus auf OnLastWindowClose oder OnExplicitShutdown zu ändern.

Von MSDN:

OnMainWindowClose: Eine Anwendung schaltet sich ab, wenn entweder das Hauptfenster schließt oder Shutdown aufgerufen wird.
OnExplicitShutdown: Eine Anwendung wird nur heruntergefahren, wenn Shutdown aufgerufen wird.

+0

Danke Zach. Das war richtig. Ich habe nicht verstanden, dass mein Dialogfenster die MainWindow-Referenz gestohlen hat, obwohl ich das MainWindow-Objekt einige Zeilen darunter zurückgesetzt habe. – TWood

+0

@TWood: Gern geschehen. Ich denke, die verwirrende Sache ist wahrscheinlich, dass 'OnMainWindowClose' nicht bedeutet, wenn das' MainWindow'-Fenster geschlossen wird, sondern wenn das erste geöffnete Fenster geschlossen wird. –