2010-09-17 3 views
5

У меня есть приложение wpf, и я создал окно входа в систему, которое используется для построения строки подключения приложения. У меня возникают проблемы с закрытием первого диалогового окна и отпирание MainWindow за ним. Я думаю, что закрытие события выходит из диалогового окна входа в систему и застревает в MainWindow, потому что, как только я создаю объект MainWindow в коде и вызываю Show(), он просто перемещается прямо мимо моего обработчика события Startup и в мой конструктор, затем onClosing handlers MainWindow без отображения самого окна. В app.xaml указан параметр ShutdownMode = OnMainWindowClose.wpf- Application_Startup - диалоговое окно загрузки THEN mainwindow

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>(); 
    } 

Может ли кто-нибудь помочь мне с этим поведением?

ответ

4

Проблема, вероятно, связана с ShutdownMode="OnMainWindowClose". Wpf считает, что первое окно открыто как «главное окно». В вашем случае wpf видит ваше окно входа в систему как основное окно и выходит из приложения при его закрытии.

Попробуйте изменить режим выключения на OnLastWindowClose или OnExplicitShutdown.

От MSDN:

OnMainWindowClose: приложение выключается, когда либо главное окно закрывается, или Shutdown называется.
OnExplicitShutdown: Приложение отключается, только когда вызывается Shutdown.

+0

Спасибо Зак. Это было правильно. Я не понял, что мое диалоговое окно украло ссылку MainWindow, даже если я сброшу объект MainWindow на несколько строк ниже. – TWood

+0

@TWood: Добро пожаловать. Я думаю, что запутанная вещь, вероятно, заключается в том, что «OnMainWindowClose» не означает, что окно «MainWindow» закрывается, но когда закрывается первое окно. –

Смежные вопросы