You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF程序:如何实现注册成功后显示Start Program按钮?

问题分析与解决方案:WPF注册后「Start Program」按钮不显示的问题

嘿,我一眼就看出问题出在哪了——你在操作两个完全独立的Registration实例!

在Startup的构造函数里,你新建了一个Registration对象并检查它的LogIn属性,但这个对象和你点击「Register」按钮打开的注册窗口根本不是同一个。注册成功后你修改的是弹窗那个实例的LogIn,而构造函数里的那个实例早就被销毁了,所以构造函数里的判断完全感知不到注册后的状态变化,按钮自然不会显示。

下面给你两种靠谱的解决办法,还有额外的安全优化建议:


方案1:用ShowDialog()等待注册窗口关闭(最简单直接)

ShowDialog()会阻塞当前线程,直到注册窗口关闭,这时候我们可以直接获取弹窗实例的LogIn状态来更新按钮:

修改Startup.xaml.cs里的Button_Register方法:

private void Button_Register(object sender, RoutedEventArgs e)
{
    Registration registration = new Registration();
    registration.ShowDialog(); // 改用ShowDialog,等待窗口关闭
    // 窗口关闭后直接检查状态
    if (registration.LogIn)
    {
        StartButton.Visibility = Visibility.Visible;
    }
}

同时调整Registration.xaml.cs的Submit方法顺序:

把LogIn = true移到Close()之前,避免窗口关闭后无法访问属性:

else
{
    // ... 省略数据库操作代码 ...
    MessageBox.Show("You were successfully registered, and automatically logged in!", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
    LogIn = true; // 先设置状态
    Close(); // 再关闭窗口
}

方案2:用自定义事件通知(更优雅的非阻塞方式)

如果不想用阻塞的ShowDialog(),可以通过事件让注册窗口主动通知主窗口注册成功:

第一步:在Registration类里定义事件

public partial class Registration : Window
{
    // 定义注册成功的事件
    public event EventHandler RegistrationCompleted;

    public Registration()
    {
        InitializeComponent();
    }

    private void Submit(object sender, RoutedEventArgs e)
    {
        // ... 省略验证代码 ...
        else
        {
            // ... 省略数据库操作代码 ...
            MessageBox.Show("You were successfully registered, and automatically logged in!", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
            // 触发事件通知主窗口
            RegistrationCompleted?.Invoke(this, EventArgs.Empty);
            Close();
        }
    }
}

第二步:在Startup里订阅事件

private void Button_Register(object sender, RoutedEventArgs e)
{
    Registration registration = new Registration();
    // 订阅注册完成事件
    registration.RegistrationCompleted += (s, args) =>
    {
        // 确保在UI线程更新控件
        Dispatcher.Invoke(() =>
        {
            StartButton.Visibility = Visibility.Visible;
        });
    };
    registration.Show();
}

重要安全提醒:修复SQL注入漏洞!

你的数据库插入代码用了字符串拼接,这是严重的安全隐患,黑客可以通过输入恶意字符串篡改你的数据库。一定要改用参数化查询:

// 替换原有数据库操作代码
using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.connection_String))
{
    string sql = "INSERT INTO tbl_Users (Username, Password) VALUES (@Username, @Password)";
    using SqlCommand sqlCommand = new SqlCommand(sql, connection);
    // 添加参数,避免SQL注入
    sqlCommand.Parameters.AddWithValue("@Username", username);
    sqlCommand.Parameters.AddWithValue("@Password", password);
    connection.Open();
    sqlCommand.ExecuteNonQuery();
}

另外,绝对不要明文存储密码!应该用BCrypt或PBKDF2等哈希算法对密码加密后再存入数据库。


最后:移除无用代码

原来Startup构造函数里新建Registration并检查LogIn的逻辑完全没用,直接删掉就行:

public Startup()
{
    InitializeComponent();
    // 删掉下面这段无效代码
    // Registration registration = new Registration();
    // if (registration.LogIn == true)
    // {
    //     StartButton.Visibility = Visibility.Visible;
    // }
}

内容的提问来源于stack exchange,提问作者Gogo Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:57:43