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?
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
@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. –