これは、私の WPF アプリケーションの App コンストラクターです。
public partial class App
{
public App()
{
Run(new Login(false));
}
}
そして、これは私のログインコンストラクターです:
public Login(bool ignoreSettings)
{
InitializeComponent();
if (ignoreSettings)
{
TxtUsername.Text = SettingsSaver.LoadUsername();
TxtCrmUrl.Text = SettingsSaver.LoadCrmUrl();
return;
}
if (string.IsNullOrWhiteSpace(SettingsSaver.LoadUsername()) || string.IsNullOrWhiteSpace(SettingsSaver.LoadCrmUrl())) return;
try
{
CrmConnector.ConnectToCrm();
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}
catch (SecurityAccessDeniedException)
{
MessageBox.Show(@"Uw inloggegevens zijn niet correct. Gelieve deze te controleren en opnieuw te proberen.");
}
finally
{
Close();
}
}
App コンストラクターを開始し、Login コンストラクターを問題なく通過しますが、Login コンストラクターの終了後に再び App コンストラクターに到達すると、追加情報と共に InvalidOperationException でクラッシュします。ウィンドウが閉じられた後の.EnsureHandle。
コンストラクターの目的は次のとおりです。アプリケーションが最初に開始されたときに、このアプリケーションの既存の設定があるかどうかを確認したいと考えています。存在する場合は、それらの設定を使用してサード パーティ (Dynamics CRM 2011) に接続し、アプリケーションのメイン ウィンドウを開いて、ログイン画面を閉じます。そこにない場合は、ユーザーに設定してもらいたいです。
ただし、メイン画面のボタンからこのウィンドウを起動できるようにしたいのですが、その場合、デフォルト設定を無視してログインウィンドウを再度起動し、設定を再度設定できるようにする必要があります。
私はすでに2つのコンストラクターを使用して動作させることができましたが、2番目のコンストラクター(メイン画面のボタンから起動するコンストラクター)のパラメーターを基本的に無視するため、Resharperはそれを行うと文句を言います。統一されたコンストラクターなので、Resharper は文句を言いません。
編集: MainWindow で次のコードを使用して、設定を変更すると新しいウィンドウが作成されるため、ログイン ウィンドウを保持したくありません。
private void BtnSettings_Click(object sender, RoutedEventArgs e)
{
Login login = new Login(true);
login.Show();
Close();
}
編集:いくつかの明確化:複数のウィンドウを表示したくありません。私が欲しいのは:
- 起動時に Login.xaml を起動します。
- Login.xaml の起動時に、設定が既に設定されているかどうかを確認します。
- 設定がない場合は、設定のために Login.Xaml を表示します。
- 設定が設定されている場合は、保存された設定で MainWindow を起動します。
さらに、Login.xaml を強制的に起動する必要がある MainWindow のボタンがありますが、設定があるかどうかは確認しません。これらは現在別々のコンストラクターであり、それらの 1 つのコンストラクターを作成したいと思います。