wpf- Application_Startup - загрузить диалоговое окно, ТО главное окно - PullRequest
5 голосов
/ 17 сентября 2010

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

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

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

1 Ответ

4 голосов
/ 17 сентября 2010

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

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

С MSDN :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...