注册成功后如何使按钮可见?

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不会更新。跨度> 添加了一些额外的信息,我认为这已经足够了,如果没有请告诉我

以上是关于注册成功后如何使按钮可见?的主要内容,如果未能解决你的问题,请参考以下文章

即使在sencha中按下按钮后,如何使按钮的图像可见

C# 使按钮在两个条件为真后可见,可绑定属性

使用按钮使组件不可见

如何使 UIButton 不可见,但如果按下仍然可以工作?

MS ACcess 使文本框在按钮单击时可见

Jquery Button 使表单可见