在 WPF C# 中实现登录表单

Rox*_*Pro 0 c# authentication wpf

我正在尝试在我的应用程序中创建登录窗口,我对 WPF 还很陌生,这对我来说不太顺利。

这就是我所做的,我什至不确定这是正确的方法,但无论如何我的问题是在代码注释中描述的。

 /// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Window_LogInScreen loginScreen = new Window_LogInScreen();
        loginScreen.ShowDialog();

        if (loginScreen.DialogResult == true)
        {
            MessageBox.Show("login success I should keep executing my application.."); // how could I continue my application if this condition is allright?
        }
        else
        {
            MessageBox.Show("login failed"); //how could I stop my application if I reach this code, and how to stay on LogIn_Screen form so user can enter password again..
        }

        lblDate.Text = DateTime.Now.Date.ToString("MM/dd/yyyy");
        lblTime.Text = DateTime.Now.ToString("HH:mm:ss");
    }


}
Run Code Online (Sandbox Code Playgroud)

我的 Window_LogInScreen :

public partial class Window_LogInScreen : Window
{
    public Window_LogInScreen()
    {
        InitializeComponent();
        lblPasswordBox.Focus();
    }


    private void Window_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            if (lblPasswordBox.Password == "1")//lets say pw is "1" for testing purposes
            {
                this.DialogResult = true;
                this.Close();
            }
            else
                this.DialogResult = false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么伙计们,我怎样才能实现这一目标呢?

在窗口窗体中,我会这样做是 Program.cs,但在 WPF 中我不知何故迷失了,我不知道如何以正确的方式实现这一点,

但我的逻辑是:

1)在应用程序运行之前打开登录屏幕,当用户按键盘上的 Enter 时检查密码,如果密码正确则将 DialogResult 设置为 true,

2)返回MainWindow,检查是否有DialogResult==true,如果有,则继续执行MainWindow,否则,停止应用程序并继续,LogIn_Screen以便用户可以再次输入密码。

谢谢各位,干杯

Xioy312 回答后编辑:

@Xiaoy312你发布的代码真的很棒,我对这段代码很感兴趣,但对我来说看起来有点难以理解。

让我们回到你的第一次编辑,

  if (e.Key == Key.Enter && lblPasswordBox.Password == "1")
    {
        this.DialogResult = true;
        this.Close();
    }
Run Code Online (Sandbox Code Playgroud)

this.DialogResult如果条件不满足,为什么不会变成 false?因为使用您在上次编辑之前在答案中发布的代码, MessageBox.Show("login failed");fromApplication_Startup永远不会到达,我想知道为什么?if (e.Key == Key.Enter && lblPasswordBox.Password == "1")我想如果不满足提到的条件( ),那么 DialogResult 将是 false 并且MessageBox.Show("login failed"); 会调用其他部分?但实际上这不是真的,因为在这里我们的失败尝试是沉默的,我想知道为什么?

而且,应用程序为什么会以这种行为退出?你能解释一下后面发生的事情吗?据我所知,你正在为 DialogResult 赋值,以防它是“1”..?

#region Behavior 1: Exit the application on invalid password
        this.DialogResult = lblPasswordBox.Password == "1";
        this.Close();
        #endregion
Run Code Online (Sandbox Code Playgroud)

您能稍微解释一下这段代码吗,我将非常感激!

Xia*_*312 5

如果您想要将用户锁定在应用程序之外,除非他们经过身份验证,您可以定义启动例程而不是MainWindow直接打开。

在 中App.xaml,删除该StartupUri属性并添加这两个属性:

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup"
             ShutdownMode="OnExplicitShutdown">
</Application>
Run Code Online (Sandbox Code Playgroud)

OnExplicitShutdown是为了防止应用程序在完成登录窗口后关闭。

在 中App.xaml.cs,您应该找到事件处理程序Application_Startup,您可以在其中指示应用程序的流程:

private void Application_Startup(object sender, StartupEventArgs e)
{
    try
    {
        if (new LoginWindow().ShowDialog() == true)
        {
            MessageBox.Show("login success I should keep executing my application..");
            new MainWindow().ShowDialog();
        }
        else
        {
            MessageBox.Show("login failed");
        }
    }
    finally
    {
        Shutdown();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:登录逻辑应包含在 中LoginWindow,并且不应泄漏到Application或 中MainWindow

private void Window_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    // lets say pw is "1" for testing purposes
    if (e.Key == Key.Enter && lblPasswordBox.Password == "1")
    {
        this.DialogResult = true;
        this.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您不希望无效密码默默失败,您可以在以下位置更改此行为PreviewKeyDown

private void LoginWindow_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        // You should keep only one of two:
        #region Behavior 1: Exit the application on invalid password
        this.DialogResult = lblPasswordBox.Password == "1";
        this.Close();
        #endregion
        #region Behavior 2: Warn the user on invalid password
        if (lblPasswordBox.Password == "1")
        {
            this.DialogResult = true;
            this.Close();
        }
        else
        {
            MessageBox.Show("invalid password");
        }
        #endregion
    }
}
Run Code Online (Sandbox Code Playgroud)