Я очень новичок в C # и WPF, поскольку я учусь самостоятельно.

Я реализовал экран входа в систему и хочу, чтобы он действовал обычным образом: пользователь вводит данные для входа (имя пользователя, pw). Если информация в порядке, экран входа должен закрыться и появится следующий экран. Вот как я это сделал:

Мой код XAML для кнопки

<Button x:Name="BtnHelloConnect" Content="Connect" Click="BtnHelloConnect_Click"  IsDefault="True"/>

При нажатии запускается этот код:

private void BtnHelloConnect_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                using (var Connect = new SqlConnection(connstr))
                {
                    Connect.Open();

                    foreach (ConnectResponse connectResponse in new CheckConnection().CheckIdentity(TextBoxLoginID.Text, PasswprdBoxLoginMDP.Password, ComboBoxLoginInst.Text))
                    {
                            if (connectResponse.Reponse == "1")
                            {
                                LoggedInData.LoggedInUserId = TextBoxLoginID.Text; //These are some classes that I have created to stored logged-in Data
                                LoggedInData.LoggedInstitutionId = connectResponse.Entity;

                                AuthentificationAccess.CheckPrivilege(LoggedInData.LoggedInUserId, LoggedInData.LoggedInstitutionId);
                            }                            
                            else
                            {
                                MessageBox.Show(connectResponse.Reponse, "", MessageBoxButton.OK, MessageBoxImage.Stop);
                                return;
                            }
                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }


internal class CheckConnection
{
    //Here is the method where I execute a procedure to check whether the user has entered the right loggins. The method return a string "connectResponse"
}

internal class ConnectResponse
    {
        public string Reponse { get; set; }

        public string Entity { get; set; }
    }


public static class AuthentificationAccess
    {        
        public static void CheckPrivilege (string username, string entityid)
        {
            string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;

            HomeWindow homeWindow = new HomeWindow();
            MainWindow mainWindow = new MainWindow();

            using (var Connect = new SqlConnection(connstr))
            {
                Connect.Open();
                using (var Command = new SqlCommand("My Procedure", Connect))
                {
                    Command.CommandType = CommandType.StoredProcedure;
                    Command.Parameters.Add("@username", SqlDbType.VarChar).Value = username;
                    Command.Parameters.Add("@entity_id", SqlDbType.VarChar).Value = entityid;
                    SqlDataReader dr = Command.ExecuteReader();
                    while (dr.Read())
                    {
                        string UserCategory = dr.GetString(0); 

                        if (UserCategory == "Client")
                        {
                            homeWindow.MenuBarProfile.Visibility = Visibility.Collapsed;
                        }
                        else
                        {
                            MessageBox.Show(UserCategory, "", MessageBoxButton.OK, MessageBoxImage.Stop);
                            mainWindow.Show();
                            return;
                        }
                    }
                    Application.Current.MainWindow.Close();
                    homeWindow.Show();                   
                }
            }
        }

    }

Проблема, с которой я столкнулся, возникает при выполнении закрытия главного окна (окна входа в систему) с помощью команды: Application.Current.MainWindow.Close();.

При первом входе в систему все работает нормально: главное окно закрывается, а второе открывается.

Но при втором входе в систему главное окно не закрывается, а второе открывается.

Я потратил 3 дня, пытаясь найти решение для этого, и я просто учусь на блогах и Youtube видео, я не смог решить эту проблему.

Я знаю, что здесь есть много похожих вопросов с теми же проблемами, но большинство имеет дело с решениями в MVVM. Я не очень знаком со всем MVVM, поэтому мне трудно воспроизвести. Учитывая мою реализацию, есть ли простой способ решить эту проблему?

0
Bruno Bukavu Thai 6 Май 2020 в 00:11

2 ответа

Лучший ответ

Я не думаю, что CheckPrivilege - «правильное» место для вызова Close. Вместо этого я думаю, что вы должны изменить метод на:

public static string CheckPrivilege (string username, string entityid)

Будет возвращена «Категория пользователя», если учетные данные были действительными, в противном случае null. И это не будет ничего делать с окнами. Это дает вам хороший static метод, который вы можете вызывать в любом месте вашего приложения для проверки учетных данных.

Конкретная логика пользовательского интерфейса, заключающаяся в закрытии окна входа в систему и открытии основного окна, а также скрытии / отображении различных элементов, будет обрабатываться внутри окна входа в систему или других задействованных окон с использованием этого возвращаемого значения. Таким образом, вы можете позвонить this.Close() с помощью нажатия кнопки.

1
Keith Stein 5 Май 2020 в 22:59

Вместо двух окон вы можете использовать одно окно с двумя разными страницами. если пользователь аутентифицирован, вы можете легко перейти на следующую страницу.

0
Chamini_M 6 Май 2020 в 18:54