Вход Wpf... это правильно?
У меня есть приложение WPF с LoginWindow для доступа, поэтому я создаю Splash Screen для этого окна Login следующим образом:
- в App.xaml
< Application x:Class="WPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_Startup"
/>
- в App.xaml.cs:
private void Application_Startup(object sender, StartupEventArgs e)
{
Login login = new Login();
login.Show();
}
- и в Login.xaml.cs, если журнал выполнен успешно:
PrimaryWindow mainWindow= new PrimaryWindow ();
Application.Current.MainWindow = mainWindow;
this.Close();
mainWindow.Show();
. Этот код прав, но искренне с моими плохими знаниями, я не знаю, что хороший метод для применения к окну входа или нет, и я не знаю, может ли этот метод быть "опасным" для моего приложения, которое хранит данные из базы данных и имеет множество функций, поэтому я спрашиваю вас, хорош ли мой способ или нет, и если у вас есть лучший способ, вы можете предложить или показать мне это?
Спасибо за внимание.
Счастливый день.
Ответы
Ответ 1
Я бы справился с этим с помощью 2 окон и метода 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();
}
}
Это позволяет пользователю закрыть приложение, просто закрыв окно входа в систему (т.е. не войдя вообще) или закрыв главное окно ПОСЛЕ того, как они использовали его некоторое время.
Ответ 2
Im, используя этот
void App_Startup(object sender, StartupEventArgs e)
{
this.MainWindow = new MainWindow();
LoginWindow loginWindow = new LoginWindow();
if (loginWindow.ShowDialog() ?? false)
{
this.MainWindow.Show();
}
else
{
this.Shutdown();
}
}
Или это в случае, если MainWindow необходимо создать после проверки учетных данных.
void App_Startup(object sender, StartupEventArgs e)
{
this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
LoginWindow loginWindow = new LoginWindow();
if (loginWindow.ShowDialog() ?? false)
{
this.ShutdownMode = ShutdownMode.OnMainWindowClose;
this.MainWindow = new MainWindow();
this.MainWindow.Show();
}
else
{
this.Shutdown();
}
}
Ответ 3
Лично я не думаю, что это хорошая идея для окна Login, чтобы убить главное окно приложения. Почему бы не сделать что-то подобное?
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();
Ответ 4
Ваш код выглядит нормально, но лично мне нравится иметь вещи в одном месте - логин должен беспокоиться только о входе в систему, а не о том, показывать ли главное окно или приложение отключения. Итак, мое решение будет примерно таким:
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;
}
}
Надеюсь, что это поможет.
Ответ 5
Обычно я использую служебный объект, чтобы обрабатывать все, что связано с логином. У меня также есть объекты 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>();
}
Ответ 6
Выглядит хорошо для меня - этот код сам по себе не является "опасным". Что может быть опасно, так это то, как вы собираете и обрабатываете учетные данные пользователя в своем окне входа в систему, но вы не разместили этот код, поэтому я не могу комментировать.
Вы можете немного оптимизировать этот код, используя StartupUri="Login.xaml"
в своем теге приложения вместо указания на обработчик событий, чтобы добиться такого же эффекта с меньшим количеством кода.