Логин Wpf ... это правильно? - PullRequest
10 голосов
/ 09 июня 2009

У меня есть приложение WPF с окном LoginWindow, поэтому я создаю заставку для этого окна входа следующим образом:

- в приложении. 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();

. Этот код верен, но, учитывая мои плохие знания, я не знаю, является ли это хорошим способом подать заявку на окно входа в систему или нет, и я не знаю, может ли этот метод быть «опасным» для моего приложения, хранящего данные из базы данных и имеют много функций, поэтому я спрашиваю вас, хорош ли мой путь, и если у вас есть лучший способ, можете ли вы предложить или показать мне это?

Спасибо за внимание.

Удачного дня.

Ответы [ 6 ]

15 голосов
/ 05 июля 2009

Я бы обработал это с 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();
    }
}

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

4 голосов
/ 01 апреля 2011

Я использую это

    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();
        }
    }
1 голос
/ 12 сентября 2009

Обычно я использую объект службы для обработки всего, что связано с входом в систему. У меня также есть объекты 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 голос
/ 03 июля 2009

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

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 голос
/ 09 июня 2009

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

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();
0 голосов
/ 09 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...