Вход 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" в своем теге приложения вместо указания на обработчик событий, чтобы добиться такого же эффекта с меньшим количеством кода.