2015-03-29 4 views
1

У меня есть приложение C# WPF, которое имеет окна входа в систему, поскольку это URI запуска. Я хочу закрыть окно запуска, которое является окном входа, когда комбинация имени пользователя и пароля верна.Как закрыть стартовое окно

У меня есть этот код

var username = query.username; 
var password = query.password; 

if (userTexbox.Text == username.ToString() && passwordbox.Password == password.ToString()) 
{ 
    var entity = new Log 
    { 
     user = userTexbox.Text, 
     dateTime = DateTime.Now.ToString() 
    }; 
    logCollection.Insert(entity); 

    Mainwindow main = new MainWindow(); 
    this.Close(); 
} 
else 
{ 
    MessageBox.Show("User not found/Wrong credentials", "Re-enter Credentials"); 
} 

Но даже с помощью метода Close(), окно Логин все еще виден, хотя и не активен.

+1

Единственная причина, по которой ваше окно не закрывается, вероятно, связано с тем, что некоторые операции в вашем конструкторе Mainwindow или logCollection.Insert блокируются, поэтому ваш код никогда не достигает этого. Close(), если вы поместите точку останова в строку Close, вы заметят, что его так и не достигли. –

ответ

2

Измените логику: установите главное окно в качестве окна запуска, а затем отобразите окно входа в главное окно. Проверьте приведенный ниже код, он предназначен для главного конструктора окна:

... 
public MainWindow() 
{ 
    InitializeComponent(); 

    //--init main windows minimized 
    WindowState = System.Windows.WindowState.Minimized; 

    Loaded += 
     delegate 
     { 
      //hide main window 
      Hide(); 

      //initialize the login window 
      var loginWin = new LoginWindow 
      { 
       WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen, 
       WindowStyle = System.Windows.WindowStyle.SingleBorderWindow, 
      }; 

      loginWin.Closed += delegate 
      { 
       //check login result (OK) 
       if (loginWin.Result != LoginResult.Success) 
        Application.Current.Shutdown(1); 

       //--display the main window 
       Show(); 
       WindowState = System.Windows.WindowState.Normal; 
       Focus(); 
      }; 

      //show&focus the login 
      loginWin.Show(); 
      loginWin.Focus(); 
     }; 
} 
... 

Надеюсь, это поможет.

EDIT

Здесь LoginWindow код позади.

public partial class LoginWindow : Window 
{ 
    public LoginResult Result { get; private set; } 

    public LoginWindow() 
    { 
     InitializeComponent(); 
    } 

    private void ButtonLogin_OnClick(object sender, RoutedEventArgs e) 
    { 
     //example login button 
     Result = DoLogin(); 
     Close(); 
    } 

    private LoginResult DoLogin() 
    { 
     //NOTE: Add your login logic here (for now sucess response) 
     return LoginResult.Success; 
    } 
} 

public enum LoginResult 
{ 
    Unknow, 
    Success, 
    Failed 
} 
+0

Я не уверен, что пытается использовать loginWin.Result, является ли это переменной из loginWindow? – f123

+0

@fredpedro 'loginWin.Result' будет хранить результат входа, например: это может быть Enum, как' public enum LoginResult {Unknown, Failed, Success} '. Я надеюсь, что это помогает. Дай мне знать, если тебе еще понадобится помощь. – dbvega

0

То, что вы здесь хватает Назначение MainWindow

Application.Current.MainWindow = main; 

После создания нового экземпляра MainWindow, если вы назначаете ему Application.Current.MainWindow (перед закрытием окна входа в систему), то есть главное окно, чтобы продолжить поток STA, и поток LoginWindow можно освободить.

Дайте мне знать, если это поможет.

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