如何更改WPF应用程序的StartupUri?

Aka*_*ava 17 wpf uri startup

我试图修改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


Ala*_*tts 6

而不是覆盖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)


Joe*_*ran 6

你还在XAML中指定了StartupUri吗?如果是这样,请将其删除,看看是否有帮助.MSDN来源

如果没有,您可能需要以不同的方式处理:将Dialog作为启动,然后从该点打开另一个基于所选值的Window.


小智 6

试试OnStartup():

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);
Run Code Online (Sandbox Code Playgroud)