Вход в систему Wpf … действительно ли это является правильным?

Компактная форма для коротких команд (без 'echo'):

IF "%ID%"=="0" ( ... & ... & ... ) ELSE ^
IF "%ID%"=="1" ( ... ) ELSE ^
IF "%ID%"=="2" ( ... ) ELSE ^
REM default case...

После ^ должен быть немедленный конец строки без пробелов.

10
задан JayJay 9 June 2009 в 03:47
поделиться

5 ответов

Я бы справился с этим с помощью двух окон и метода 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();
    }
}

Это позволяет пользователю закрыть приложение, просто закрыв окно входа в систему (т.е. не входя в систему вообще) или закрыв главное окно ПОСЛЕ того, как они использовал его некоторое время.

15
ответ дан 3 December 2019 в 18:00
поделиться

Лично я не думаю, что окно входа в систему закрывает главное окно приложения. Почему бы не сделать что-то подобное?

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();
1
ответ дан 3 December 2019 в 18:00
поделиться

Мне кажется, этот код не «опасен» сам по себе. Что может быть опасно, так это то, как вы собираете и обрабатываете учетные данные пользователя в окне входа в систему, но вы не опубликовали этот код, поэтому я не могу комментировать.

Вы можете немного оптимизировать этот код, используя StartupUri = «Login.xaml» в вашем теге Application вместо указания на обработчик событий даст тот же эффект с меньшим количеством кода.

0
ответ дан 3 December 2019 в 18:00
поделиться

Ваш код кажется нормальным, но лично мне нравится хранить все в одном месте - логин должен волновать только логин, а не то, показывать ли главный экран или закрывать приложение. Итак, мое решение будет примерно таким:

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;
        }
    }

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

1
ответ дан 3 December 2019 в 18:00
поделиться

Я обычно использую служебный объект для обработки чего-либо связанные с логином. У меня также есть объекты 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>();
}
1
ответ дан 3 December 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: