注册成功后如何使按钮可见?
Posted
技术标签:
【中文标题】注册成功后如何使按钮可见?【英文标题】:How can I make button visible when Registration was successful? 【发布时间】:2020-06-12 11:24:00 【问题描述】:所以我有一个简单的启动窗口,其中的按钮有:“登录”、“注册”、“退出”,最后是“启动程序”。
默认情况下,“启动程序”按钮是不可见的。
“登录”按钮还不起作用,所以忘记它吧。
“退出”按钮关闭程序。
“注册”按钮会打开一个新窗口,您可以在其中输入您的用户名和密码。然后将其保存在与 SQL 数据库连接的表中。
我有一个名为“LogIn”的公共布尔值,默认设置为 false。当我成功注册时,我将其设置为 true。然后在我的 Startup.xaml 中检查布尔“LogIn”是否为真,如果为真,则应将“开始程序”按钮的可见性设置为可见。但不幸的是,它不起作用。
提前感谢您的帮助。
我的代码:
我的 Startup.xaml:
<Window x:Class="MiiUse.Startup"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MiiUse"
mc:Ignorable="d"
Title="Welcome To MiiUse" Height="500" Width="850"
Style="StaticResource Startup"
StateChanged="MaximizeWindow" ResizeMode="NoResize">
<Grid>
<Button Style="StaticResource RoundButton" Content="Start Program" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Start" x:Name="StartButton" Visibility="Hidden"/>
<Button Style="StaticResource RoundButton" Content="Exit" HorizontalAlignment="Right" VerticalAlignment="Bottom" Click="Button_Exit" />
<Button Style="StaticResource RoundButton" Content="Register" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,16,0" Click="Button_Register"/>
<Button Style="StaticResource RoundButton" Content="Login" HorizontalAlignment="Right" Margin="0,0,77,0" VerticalAlignment="Top" RenderTransformOrigin="0.379,0.002" Click="Button_Login"/>
</Grid>
</Window>
它的样子:
我的 Startup.xaml.cs:
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace MiiUse
/// <summary>
/// Interaction logic for Startup.xaml
/// </summary>
public partial class Startup : Window
public Startup()
InitializeComponent();
Registration registration = new Registration();
if (registration.LogIn == true)
StartButton.Visibility = Visibility.Visible;
private void Button_Start(object sender, RoutedEventArgs e)
MainWindow mainWindow = new MainWindow();
this.Close();
mainWindow.Show();
private void Button_Exit(object sender, RoutedEventArgs e)
this.Close();
private void MaximizeWindow(object sender, EventArgs e)
if (this.WindowState == WindowState.Maximized)
this.WindowState = WindowState.Normal;
private void Button_Register(object sender, RoutedEventArgs e)
Registration registration = new Registration();
registration.Show();
private void Button_Login(object sender, RoutedEventArgs e)
我的 Registration.xaml:
<Window x:Class="MiiUse.Registration"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MiiUse"
mc:Ignorable="d"
Title="Registration" Height="320" Width="370">
<Grid>
<Label Content="Enter your Username:" HorizontalAlignment="Left" Margin="44,44,0,0" VerticalAlignment="Top"/>
<Label Content="Enter your Password:" HorizontalAlignment="Left" Margin="44,98,0,0" VerticalAlignment="Top" />
<Button Content="Submit" HorizontalAlignment="Left" Margin="44,245,0,0" VerticalAlignment="Top" Click="Submit"/>
<Button Content="Cancel" HorizontalAlignment="Left" Margin="124,245,0,0" VerticalAlignment="Top" Click="Cancel"/>
<TextBox x:Name="Username" HorizontalAlignment="Left" Margin="44,75,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<PasswordBox x:Name="Password" HorizontalAlignment="Left" Margin="44,129,0,0" VerticalAlignment="Top" Width="120"/>
</Grid>
</Window>
它的样子:
我的 Registration.xaml.cs:
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace MiiUse
/// <summary>
/// Interaction logic for Registration.xaml
/// </summary>
public partial class Registration : Window
public Registration()
InitializeComponent();
public bool LogIn = false;
private void Submit(object sender, RoutedEventArgs e)
string username = Username.Text;
string password = Password.Password;
if(Password.Password.Length == 0)
MessageBox.Show("Password can't be empty!", "Invalid Input!", MessageBoxButton.OK, MessageBoxImage.Error);
Password.Focus();
else if(Username.Text.Length == 0)
MessageBox.Show("Username can't be empty!", "Invalid Input!", MessageBoxButton.OK, MessageBoxImage.Error);
Username.Focus();
else
using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.connection_String))
using SqlCommand sqlCommandGetTemplatesAndDrafts = new SqlCommand(@$"
Insert into tbl_Users (Username, Password) values('username','password')", connection);
connection.Open();
sqlCommandGetTemplatesAndDrafts.ExecuteNonQuery();
connection.Close();
MessageBox.Show("You were successfully registered, and automatically logged in!", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
Close();
LogIn = true;
private void Cancel(object sender, RoutedEventArgs e)
Close();
【问题讨论】:
【参考方案1】:在Registration
窗口打开后,您没有设置Visibility
属性。
您可以将Registration
窗口显示为模式:
private void Button_Register(object sender, RoutedEventArgs e)
Registration registration = new Registration();
registration.ShowDialog();
if (registration.LogIn == true)
StartButton.Visibility = registration.LogIn ? Visibility.Visible : Visibility.Hidden;
同时设置LogIn
在你关闭提交窗口之前:
...
LogIn = true;
Close();
另一种选择是注入Registration
并引用MainWindow
:
private readonly MainWindow _mainWindow;
public Registration(MainWindow mainWindow)
_mainWindow = mainWindow;
InitializeComponent();
...
private void Submit(object sender, RoutedEventArgs e)
...
_mainWindow.StartButton.Visibility = Visibility.Visible;
Close();
...
主窗口:
private void Button_Register(object sender, RoutedEventArgs e)
Registration registration = new Registration(this);
registration.Show();
如果你对 WPF 和 XAML 很认真,你应该学习 [MVVM]。
【讨论】:
【参考方案2】:将您的“LogIn”从 bool 转换为“Visibility”,因此我们可以提及 Visibility.visible 或 Visibility.hidden,而不是 true 或 false。如下:
public Visibility LogIn = Visibility.Hidden;
最后,将您的启动按钮可见性绑定到此 LogIn 变量
所以在SQL成功完成后:
LogIn = Visibility.visible ;
最终绑定:
<Button Style="StaticResource RoundButton" Content="Start Program" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Start" x:Name="StartButton" Visibility="binding LogIn"/>
但这个登录应该在代码后面或视图模型中
但我认为最好的方法是创建一个名为 helper 的公共类并将这些连接变量存储在其中,以便在整个应用程序中访问它们
创建属性:
private Visibility _logIn;
public Visibility LogIn
get => _logIn;
set
_logIn= value;
OnPropertyChanged();
你的应用程序中的一些地方将它初始化为隐藏
【讨论】:
我理解你的想法,但它如何绑定到登录?它在另一个文件中。 我在 Startup.xaml.cs 中试过这个,但问题依旧:Registration registration = new Registration(); StartButton.Visibility = registration.LogIn;
即使他绑定它也不会改变,因为首先它不是属性而是字段,而且它不会引发propertychanged事件,所以ui不会更新。跨度>
添加了一些额外的信息,我认为这已经足够了,如果没有请告诉我以上是关于注册成功后如何使按钮可见?的主要内容,如果未能解决你的问题,请参考以下文章