我试图修改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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我甚至做了跟踪并发现LoginDialog工作正常并正确返回值,但设置"StartupUri"不起作用.
我在反向程序集中检查了在OnStartup之后调用App的DoStartup方法,所以从技术上讲,我的StartupUri必须加载,但它没有,在App.xaml启动uri根本没有定义.
注意:Bug已确认
我注意到ShowDialog设置了Application.MainWindow,当对话结束时,它将其设置为null,并且由于此设置,在OnStartup或Startup事件中调用Modal Dialog后,StartupUri不起作用.
关于无效的uri或类似的东西没有错误或例外.
这个方法在没有在Startup事件或OnStartup中调用DialogBox的情况下工作,我认为在这个方法上调用showdialog会导致它的主窗口设置为过期窗口,并在此之后关闭.
tof*_*tim 19
阿卡什,我遇到了这个问题,试图像你的一样实现LoginDialog.该对话框没有错误,而是行为是设计的.
不是错误.应用程序的默认ShutdownMode是OnLastWindowClosed,因此只要第一个窗口关闭,您的应用程序就会开始关闭!更改为OnExplicitShutdown并且它将起作用,但您必须管理关闭.
请参阅此前一个StackOverflow问题:WPF ShowDialog在第二次调用时立即返回null
而不是覆盖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>
Run Code Online (Sandbox Code Playgroud)
在后面的代码中:
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);
}
Run Code Online (Sandbox Code Playgroud)
这只是我的测试用例,我已经验证它可以正确执行(随机:D)
小智 6
试试OnStartup():
StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);
Run Code Online (Sandbox Code Playgroud)