Как получить информацию из закрытого окна в App.xaml.cs?

У меня несколько окон. Мой LoginWindow должен подтвердить пользователя. Если это окно закрыто, все приложение должно быть закрыто. Если пользователь вводит правильный логин, LoginWindow должно быть закрыто, а MainWindow - открыто.

Как получить информацию из закрытого окна в App.xaml.cs?

Вопрос: Моя проблема в желтом ромбе: как определить состояние процесса входа в систему?

Это мое текущее состояние.

public partial class App : Application
{
    [STAThread]
    public static void Main()
    {
        var app = new App();
        var login = new LoginWindow();
        if (app.Run(login) == 1) //<-- Problem: How to get the state from login?
        {
            var mainapp = new MainWindow();
            app.Run(mainapp);
        }
    }
}

Я попытался получить код выхода из окна входа в систему с помощью Application.Current.Shutdown(1);, но это вызвало исключение InvalidOperationException на app.Run(mainapp);, потому что Shutdown закрывает все приложение.

Environment.Exit (1)? Это остановит приложение.

mm8 13.09.2018 14:58

Может ли пользователь выйти из формы любым другим способом, кроме нажатия кнопки X на ControlBox формы?

Gabriel Stancu 13.09.2018 14:59

@ mm8 Это завершило мое полное приложение. Содержимое оператора if больше не выполняется.

Syrlia 13.09.2018 15:02

@GabrielStancu У пользователя есть кнопки «Войти» и «Отмена». Мне нужно возвращаемое значение "истина" "ложь".

Syrlia 13.09.2018 15:02

@PaulF Я прочитал эту статью. Это бесполезно. Есть только один метод, возвращающий код выхода. Но этот метод закрывает мое полное приложение.

Syrlia 13.09.2018 15:05

Мне очень жаль, @Syrlia, похоже, я и другие совершенно неверно истолковали ваш вопрос. Теперь я понимаю, что вы хотите установить возвращаемое значение Application.Run () таким образом, чтобы ваше приложение продолжало работать и могло отображать другие окна. Я еще раз отредактирую заголовок ...

Ian 14.09.2018 12:01

Насколько мне известно, единственный способ установить код возврата - это, как вы сказали, вызвать Application.Current.Shutdown, который завершит работу приложения. Я могу ошибаться, так что давайте бросим этот вопрос.

Ian 14.09.2018 12:12

На самом деле, однако, я не думаю, что ваше приложение должно вызывать Run () несколько раз - я думаю, вам следует использовать другой подход для отображения окна входа в систему, например, вызвать в нем ShowDialog (), а затем установить свойство для объекта LoginWindow. в зависимости от действия пользователя, затем проверьте свойство, когда окно входа в систему закрыто и функция ShowDialog () вернется. Есть ли причина, по которой вы не можете делать что-то подобное? Я знаю, что это сработает, потому что я пробовал.

Ian 14.09.2018 12:13

@Ian Да, я нашел решение с ShowDialog. Смотрите мой собственный ответ. Но не могли бы вы объяснить (или дать ссылку), что делает App.Run() и почему я не должен вызывать его дважды?

Syrlia 14.09.2018 13:00

Нет, не совсем, это просто ощущение, что это неправильно :) См. несколько вызовов приложения, запущенного в wpf для результатов чьего-то расследования по аналогичному вопросу.

Ian 14.09.2018 13:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
242
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я бы использовал следующий код:

Объявите переменную типа bool, чтобы проверить, закрыл ли пользователь приложение или оно было закрыто из вашего кода:

bool userClosedForm = false;

Затем внутри кнопки Close добавьте эту строку после кода, который у вас уже был:

    private void btnClose_Click(object sender, EventArgs e)
    {
        //your code
        userClosedForm = true;
    }

Добавьте событие Form_Closed, в котором вы проверяете значение переменной:

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        if (userClosedForm == true) Application.Exit();
        else 
         {
          //your code to open the next form if the user logged in and you closed the form from code
         }
    }

Надеюсь, это поможет ^^

Кроме того, == true в if (userClosedForm == true) является избыточным кодом - userClosedForm уже оценивается как истинное или ложное без дополнительной проверки, это bool.

Diado 13.09.2018 15:14

Да, я недавно перешел с VB.NET, где так не работает, придется привыкать. Но это не влияет на код ...

Gabriel Stancu 13.09.2018 15:17

Действительно, на функциональность это не влияет, это просто избыточный код :) Думаю, в VB тоже самое.

Diado 13.09.2018 15:23

Environment.Exit () завершает этот процесс и дает базовой операционной системе указанный код выхода.

Но у окна нет «возвращаемого значения». Вы можете обработать событие Closed для LoginWindow и проверить, установлено ли свойство самого окна или его модели представления. См. Следующий пример.

public class Program
{
    private static readonly App app = new App() { ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown };

    [STAThread]
    public static void Main()
    {
        LoginWindow login = new LoginWindow();
        login.Closed += Login_Closed;
        app.Run(login);
    }

    private static void Login_Closed(object sender, EventArgs e)
    {
        LoginWindow loginWindow = (LoginWindow)sender;
        loginWindow.Closed -= Login_Closed;

        if (loginWindow.LoggedIn)
        {
            MainWindow mainWindow = new MainWindow();
            app.MainWindow = mainWindow;
            app.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose;
            mainWindow.Show();
        }  
    }
}

public partial class LoginWindow : Window
{
    public LoginWindow()
    {
        InitializeComponent();
    }

    public bool LoggedIn { get; private set; }

    private void Login_Click(object sender, RoutedEventArgs e)
    {
        //if (authenticate)...
        LoggedIn = true;
        Close();
    }

    private void Cancel_Click(object sender, RoutedEventArgs e)
    {
        LoggedIn = false;
        Close();
    }
}
Ответ принят как подходящий

Нашел умное решение. Окно с возвращаемым значением называется «Диалог».


App.xaml.cs

    [STAThread]
    public static void Main()
    {
        var app = new App() { ShutdownMode = ShutdownMode.OnExplicitShutdown };
        if (new LoginWindow().ShowDialog() ?? false == true)
            app.Run(new MainWindow());
    }

LoginWindow.xaml.cs

private void OnLoginClick(object, EventArgs)
{
    this.DialogResult = true;
}

private void OnCancelClick(object, EventArgs)
{
    this.DialogResult = false;
}

Для выхода из всего приложения используйте «Application.exit ();» и чтобы открыть главное окно, создайте объект этой формы, затем используйте «object.Show ()» и «this .hide ()», чтобы скрыть форму входа.

Например: Предположим, что запрос, то есть хранимая процедура, например:

Create procedure dbo.usercheck
(
@userid nvarchar,
@password nvarchar 
)
As
Select username from login table

Код C#:

SqlCommand com=new 
SqlCommand("dbo.usercheck","connection");

If(com.executescalar()==null)
{
Application.exit();
}
else
{
Mainform f=new Mainform();
f.show();
this.hide();
}

Вы можете написать «Application.exit ();» в событии нажатия кнопки отмены, чтобы закрыть приложение всякий раз, когда вы хотите закрыть все приложение при нажатии кнопки отмены формы входа в систему.

Когда пользователь вводит неправильный идентификатор пользователя или пароль, вы можете показать сообщение об ошибке вместо выхода из приложения.

OP не хочет выходить из всего приложения

Ian 14.09.2018 13:13

Другие вопросы по теме