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
相关产品推荐
相关产品推荐

