Компактная форма для коротких команд (без 'echo'):
IF "%ID%"=="0" ( ... & ... & ... ) ELSE ^
IF "%ID%"=="1" ( ... ) ELSE ^
IF "%ID%"=="2" ( ... ) ELSE ^
REM default case...
После ^
должен быть немедленный конец строки без пробелов.
Я бы справился с этим с помощью двух окон и метода Application_Startup. Вот как выглядит мое приложение (которое имеет аналогичную идею входа в систему):
/// In App.xaml.cs
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application {
private MainWindow main = new MainWindow();
private LoginWindow login = new LoginWindow();
private void Application_Startup(object sender, StartupEventArgs e) {
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Application.Current.MainWindow = login;
login.LoginSuccessful += main.StartupMainWindow;
login.Show();
}
}
/// In LoginWindow.xaml.cs
/// <summary>
/// Interaction logic for LoginWindow.xaml
/// </summary>
public partial class LoginWindow : Window {
internal event EventHandler LoginSuccessful;
public LoginWindow() { InitializeComponent(); }
private void logInButton_Click(object sender, RoutedEventArgs e) {
if ( // Appropriate Login Check Here) {
LoginSuccessful(this, null);
Close();
} else {
// Alert the user that login failed
}
}
}
/// In MainWindow.xaml.cs
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow() { InitializeComponent(); }
internal void StartupMainWindow(object sender, EventArgs e) {
Application.Current.MainWindow = this;
Show();
}
}
Это позволяет пользователю закрыть приложение, просто закрыв окно входа в систему (т.е. не входя в систему вообще) или закрыв главное окно ПОСЛЕ того, как они использовал его некоторое время.
Лично я не думаю, что окно входа в систему закрывает главное окно приложения. Почему бы не сделать что-то подобное?
PrimaryWindow mainWindow= new PrimaryWindow ();
Application.Current.MainWindow.Hide(); // or something, don't know the exact syntax
mainWindow.Closed += delegate{Application.Current.MainWindow.Show(); };
mainWindow.Show();
Мне кажется, этот код не «опасен» сам по себе. Что может быть опасно, так это то, как вы собираете и обрабатываете учетные данные пользователя в окне входа в систему, но вы не опубликовали этот код, поэтому я не могу комментировать.
Вы можете немного оптимизировать этот код, используя StartupUri = «Login.xaml»
в вашем теге Application вместо указания на обработчик событий даст тот же эффект с меньшим количеством кода.
Ваш код кажется нормальным, но лично мне нравится хранить все в одном месте - логин должен волновать только логин, а не то, показывать ли главный экран или закрывать приложение. Итак, мое решение будет примерно таким:
App.xaml
<Application
....
StartupUri="Forms/MainWindow.xaml" >
....
</Application
App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
//Without the next line your app would've ended upon closing Login window:
ShutdownMode = ShutdownMode.OnExplicitShutdown;
//Authenticate user (if canceled returns 'false')
LoginScreen wndLogin = new LoginScreen();
if (wndLogin.ShowDialog() == false)
{
Shutdown();
}
else
{
//if you have some cache to load, then show some progress dialog,
//or welcome screen, or whatever...
//after this, the MainWindow executes, so restore the ShutdownMode,
//so the app ends with closing of main window (otherwise, you have to call
//Applicaiton.Current.Shutdown(); explicitly in Closed event of MainWindow)
ShutdownMode = ShutdownMode.OnMainWindowClose;
}
}
Надеюсь, это поможет.
Я обычно использую служебный объект для обработки чего-либо связанные с логином. У меня также есть объекты Session и Credentials (сделанные на заказ), которые сохраняются в программе. Вся логика входа хранится внутри SessionService.
static void Main(string[] args)
{
ServiceManager.RegisterService<SessionService>();
Session session;
if(ServiceManager.GetService<SessionService>().CreateSession(out session) == CreateSessionResult.Success)
{
MainWindow window = new MainWindow();
window.SetSession(session);
Application.Run(window);
}
ServiceManager.UnregisterService<SessionService>();
}