2014-08-03 2 views
0

В WPF я создал отдельное окно, чтобы содержать подсказку с паролем, которая будет отображаться при запуске. MainWindow необходимо отключить, работая только при вводе правильного пароля. Я сделал следующий для моего MainWindow.xaml.cs:Запрос пароля в новом окне

public MainWindow() 
{ 
    InitializeComponent(); 

    this.view_model = new MainViewModel(); 
    this.DataContext = view_model; 

    LoginWindow login_window = new LoginWindow(); 
    login_window.ShowDialog(); 
} 

В пользователе появляется, пароль вводится и логика Логина проводится в кнопках мыши:

private void button_Login_Click(object sender, RoutedEventArgs e) 
{ 
    Tuple<bool, string> result = view_model.Login(this.textbox_password.Password); 
    if (result.Item1 == true) 
    { 
     // Login successful 
    } 
    else 
    { 
     MessageBox.Show(result.Item2, "Failed", MessageBoxButton.OK, MessageBoxImage.Error); 
    } 
} 

Мой вопрос сейчас находится , как я могу уведомить MainWindowViewModel, что он может продолжить работу с остальной частью приложения? Есть лучший способ сделать это?

ответ

1

Один из способов - подключить событие MainWindow Initialized, чтобы открыть окно входа в главное окно.

private void MainWindow_Initialized(object sender, EventArgs e) 
    { 
     /*** Start Login ***/ 
     new LoginWindow(this).ShowDialog(); 
    } 

затем в окне входа в систему вызова метода регистрации, здесь AttemptLogin

private void loginButton_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      //Disable login button to avoid multiple login attempts 
      loginButton.IsEnabled = false; 
      m_mainform.AttemptLogin(UNtextBox.Text, PWpasswordBox.Password, otherID1, otherID2, this); 
     } 
     catch (Exception Ex) 
     { 
      loginButton.IsEnabled = true; 
      //Login Error - Report error 

     } 
    } 

только тогда, когда попытка Логин обратного вызова были проверены позволяют основные методы называться

private void LoginCheck(API.LoginResp resp, CustomAsyncStateContainer state) 
    { 
     try 
     { 
      //Process response 
      if (resp.header.errorCode != APIErrorEnum.OK) 
      { 
       //Login Failed - Show error if login failed 
       if (loginForm == null) 
        new LoginWindow(this).ShowDialog(); 
       else 
       { 
        loginForm.Activate(); 
        loginForm.loginButtonEnabled = true; 
        loginForm.PWpasswordBox.Password = null; 
       } 

      } 
      else 
      { 
       if (loginForm != null) 
       { 
        loginForm.Close(); 
        //Continue with Main App 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
       //Log error 
     } 
    } 
+0

Спасибо за ответ, у меня вопрос о реализации. Таким образом, при нажатии кнопки входа в систему вы вызываете метод входа в систему, в котором ViewModel? ViewModel для окна входа в систему или главного окна? И метод LoginCheck() есть где? Раньше я не встречал какой-либо код в методе LoginCheck(). – user3761858

+0

Не имеет значения, это может быть любой ViewModel или класс. LoginCheck фактически вызывает внешний API, поэтому обратный вызов AttemptLogin и LoginCheck является отдельным. Кроме того, вам нужно будет обработать событие закрытия LoginForm, чтобы проверить, что успешный логин/сеанс был установлен и закрыть MainWindow, если нет. – pathDongle

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