我正在尝试修改App.cs并从代码中加载WPF XAML文件,但它不能正常工作。
无论我尝试将其设置为StartupUri它都没有启动,程序将在此之后退出。
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
LoginDialog dlg = new LoginDialog();
if (dlg.ShowDialog() != true)
return;
switch (dlg.ChoiceApp) {
case ChoiceApp.CustomerEntry:
StartupUri = new Uri("/MyApp;component/Forms/CustomerEntry.xaml",
UriKind.Relative);
break;
case ChoiceApp.VendorEntry:
StartupUri = new Uri("/MyApp;component/Forms/VendorEntry.xaml",
UriKind.Relative);
break;
}
}
}
现在我甚至做了跟踪并发现LoginDialog工作正常并正确返回值,但设置“StartupUri”不起作用。
我在反向程序集中检查了在OnStartup之后调用App的DoStartup方法,所以从技术上讲,我的StartupUri必须加载,但它没有,在App.xaml启动时,uri根本没有定义。
注意:Bug已确认
我注意到ShowDialog设置了Application.MainWindow,当对话框结束时,它将其设置为null,并且由于此设置,在OnStartup或Startup事件中调用Modal Dialog后,StartupUri不起作用。
关于无效的uri或类似内容,没有任何错误或例外。
这个方法在没有在Startup事件或OnStartup中调用DialogBox的情况下工作,我认为在这个方法上调用showdialog会导致它的主窗口设置为过期窗口,并在此之后关闭。
答案 0 :(得分:18)
Akash,我遇到了这个问题,试图像你的一样实现LoginDialog。该对话框没有错误,而是行为是设计的。
不是错误。默认的ShutdownMode 应用程序是OnLastWindowClosed,所以 第一个窗口关闭后立即 您的应用程序将开始关闭 下!更改为OnExplicitShutdown和 它会起作用,但你必须这样做 管理关机。
请参阅此前的StackOverflow问题:WPF ShowDialog returns null immediately on second call
答案 1 :(得分:6)
试试OnStartup():
StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);
答案 2 :(得分:5)
而不是覆盖OnStartup()方法,而是挂钩事件。
在XAML中
<Application x:Class="SOTestWPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_Startup">
<Application.Resources>
</Application.Resources>
</Application>
在后面的代码中:
private void Application_Startup(object sender, StartupEventArgs e)
{
var rnd = new Random();
if (rnd.NextDouble() > 0.5)
StartupUri = new Uri("/SOTestWPF;component/Window1.xaml", UriKind.Relative);
else
StartupUri = new Uri("/SOTestWPF;component/Window2.xaml", UriKind.Relative);
}
这只是我的测试用例,我已经验证它是否正确执行(随机:D)
答案 3 :(得分:5)
您是否仍在XAML中指定了StartupUri?如果有,请将其删除,看看是否有帮助。MSDN Source
如果没有,您可能需要采用不同的方法:将Dialog作为启动,然后从该点打开另一个基于所选值的Window。