У меня несколько окон. Мой LoginWindow должен подтвердить пользователя. Если это окно закрыто, все приложение должно быть закрыто. Если пользователь вводит правильный логин, LoginWindow должно быть закрыто, а MainWindow - открыто.
Вопрос: Моя проблема в желтом ромбе: как определить состояние процесса входа в систему?
Это мое текущее состояние.
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
закрывает все приложение.
Может ли пользователь выйти из формы любым другим способом, кроме нажатия кнопки X на ControlBox формы?
См. c-sharpcorner.com/UploadFile/c713c3/how-to-exit-in-C-Sharp
@ mm8 Это завершило мое полное приложение. Содержимое оператора if больше не выполняется.
@GabrielStancu У пользователя есть кнопки «Войти» и «Отмена». Мне нужно возвращаемое значение "истина" "ложь".
@PaulF Я прочитал эту статью. Это бесполезно. Есть только один метод, возвращающий код выхода. Но этот метод закрывает мое полное приложение.
Мне очень жаль, @Syrlia, похоже, я и другие совершенно неверно истолковали ваш вопрос. Теперь я понимаю, что вы хотите установить возвращаемое значение Application.Run () таким образом, чтобы ваше приложение продолжало работать и могло отображать другие окна. Я еще раз отредактирую заголовок ...
Насколько мне известно, единственный способ установить код возврата - это, как вы сказали, вызвать Application.Current.Shutdown, который завершит работу приложения. Я могу ошибаться, так что давайте бросим этот вопрос.
На самом деле, однако, я не думаю, что ваше приложение должно вызывать Run () несколько раз - я думаю, вам следует использовать другой подход для отображения окна входа в систему, например, вызвать в нем ShowDialog (), а затем установить свойство для объекта LoginWindow. в зависимости от действия пользователя, затем проверьте свойство, когда окно входа в систему закрыто и функция ShowDialog () вернется. Есть ли причина, по которой вы не можете делать что-то подобное? Я знаю, что это сработает, потому что я пробовал.
@Ian Да, я нашел решение с ShowDialog
. Смотрите мой собственный ответ. Но не могли бы вы объяснить (или дать ссылку), что делает App.Run()
и почему я не должен вызывать его дважды?
Нет, не совсем, это просто ощущение, что это неправильно :) См. несколько вызовов приложения, запущенного в wpf для результатов чьего-то расследования по аналогичному вопросу.
Я бы использовал следующий код:
Объявите переменную типа 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
.
Да, я недавно перешел с VB.NET, где так не работает, придется привыкать. Но это не влияет на код ...
Действительно, на функциональность это не влияет, это просто избыточный код :) Думаю, в VB тоже самое.
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 не хочет выходить из всего приложения
Environment.Exit (1)? Это остановит приложение.