【发布时间】:2014-04-29 11:19:22
【问题描述】:
这是我的 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,并附加信息:“无法设置可见性或调用 Show、ShowDialog , 或窗口关闭后的 WindowInteropHelper.EnsureHandle。
构造函数的目标如下:当应用程序第一次启动时,我想检查是否有这个应用程序的现有设置。如果它们存在,我想使用这些设置连接到第 3 方 (Dynamics CRM 2011),打开主应用程序窗口,然后关闭登录屏幕。如果他们不在那里,我希望用户设置设置。
但是,我还希望能够从主屏幕上的按钮启动此窗口,在这种情况下,它应该忽略默认设置并再次启动登录窗口,从而允许我再次设置设置。
我已经设法使用 2 个构造函数让它工作,但是当我这样做时 Resharper 会抱怨,因为我基本上忽略了第二个构造函数中的参数(我从主屏幕上的按钮启动的那个。我正在尝试有 1 个统一的构造函数,这样 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。
此外,我在 MainWindow 上有一个按钮,它必须强制启动 Login.xaml 但不检查是否有设置。这些目前是单独的构造函数,我想为它们制作 1 个构造函数。
【问题讨论】:
-
老实说,如果你让它工作,只需禁用 R# 警告并继续。
-
如果我找不到统一构造函数的方法,我会这样做。但我宁愿完全摆脱警告,而不是仅仅压制它。
-
我也可以在我的第二个构造函数中检查 IgnoreSettings 是否为真。也可以解决 reshaper 警告。
-
您的
App.xaml文件中是否存在StartupUri="Login.xaml",它应该从那里删除,因为您在App.xaml.cs文件的构造函数中通过Run()方法调用Login! -
@VS1 当我使用 Run 方法时,我的 App.xaml 中没有该行。编辑:我也尝试使用 Startup="App_Startup()" 并将 Run() 放在那里,但这也不起作用。
标签: c# wpf constructor app-startup