2009-06-09 43 views
10

我有一個登錄窗口訪問的WPF應用程序,所以我創建此登錄窗口,如下一個閃屏:登錄Wpf ...是不是?

- 在App.xaml中- 在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" 
    /> 

的.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(); 

。這個代碼是正確的,但真誠地與我那可憐的知識,我不知道這是一個很好的方法來申請登錄窗口或沒有,我不知道,如果這種方法可以是「危險」的我的應用程序存儲數據庫中的數據並具有許多功能,所以我問你,如果我的方式好或不好,如果你有更好的方法,你可以建議或告訴我嗎?

感謝您的關注。

祝您有幸運的一天。

回答

15

我會用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(); 
    } 
} 

這使用戶可以通過關閉登錄窗口(即在所有不記錄),或者通過關閉主只需關閉應用程序窗口後他們已經使用了一段時間。

1

就我個人而言,我認爲登錄窗口關閉主應用程序窗口並不是一個好主意。爲什麼不做這樣的事情?

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

嗨弗朗西斯, 感謝回覆我,我會問你爲什麼不好殺死應用程序主窗口?因爲我的無知,我不這樣認爲。 你的代碼很好,但我不喜歡隱藏LoginWindow。 非常感謝您的幫助;)。 – JayJay 2009-06-09 06:50:14

+0

嗨JayJay, 在我看來,你做以下幾點: 1)創建一個登錄窗口 2)殺死的應用程序主窗口 3)設置登錄窗口的應用程序主窗口 上午我正確?如果是這樣,當你殺死主窗口時,在登錄窗口關閉後你會顯示什麼? – user112889 2009-06-09 20:57:16

+0

是的,沒錯, 在LoginWindow之後,我將顯示MainApplication Client來存儲,編輯,保存,刪除etc。數據,其中用戶從基於角色的安全性獲得使用該應用程序的服務器。 Thaks – JayJay 2009-06-10 02:21:17

0

看起來對我來說很好 - 這段代碼本身並不是'危險的'。什麼可能是危險的是你如何收集和處理用戶的登錄窗口的憑據,但你沒有發佈代碼,所以我不能發表評論。

您可以通過在應用程序標記中使用StartupUri="Login.xaml"而不是指向事件處理程序來優化此代碼,它會以較少的代碼實現相同的效果。

1

你的代碼似乎沒問題,但是我個人喜歡在一個地方放置東西 - 登錄應該只是擔心登錄,而不是是否顯示主屏幕或關閉應用程序。所以,我的解決辦法是這樣的:

的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

我通常使用服務對象來處理與登錄相關的任何事情。我也有一個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>(); 
} 
4

林的情況下,使用這一

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

或者,這時候主窗口必須創建檢查憑據。

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