WPF: окно закрытия не работает должным образом - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в 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, поэтому мне трудно воспроизвести. Учитывая мою реализацию, есть ли простой способ решить эту проблему?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

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

public static string CheckPrivilege (string username, string entityid)

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

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

0 голосов
/ 06 мая 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...