【问题标题】:Password prompt in new window新窗口中的密码提示
【发布时间】:2024-01-21 08:16:01
【问题描述】:

在 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 它可以继续应用程序的其余部分?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# wpf passwords


    【解决方案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
            }
        }
    

    【讨论】:

    • 感谢您的回答,我有一个关于实施的问题。那么在登录按钮点击事件中,你是在哪个ViewModel中调用了登录方法呢?登录窗口或主窗口的 ViewModel?而 LoginCheck() 方法在哪里呢?我之前没有遇到过LoginCheck()方法中的任何代码。
    • 没关系,可以是任意ViewModel或者类。 LoginCheck 实际上调用了一个外部 API,这就是 AttemptLogin 和 LoginCheck 回调是分开的原因。此外,您将需要处理 LoginForm 关闭事件以检查是否已建立成功的登录/会话,如果没有则关闭 MainWindow。
    最近更新 更多