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

时间:2009-12-22 11:38:20

标签: 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;
        }
    }
}

现在我甚至做了跟踪并发现LoginDialog工作正常并正确返回值,但设置“StartupUri”不起作用。

我在反向程序集中检查了在OnStartup之后调用App的DoStartup方法,所以从技术上讲,我的StartupUri必须加载,但它没有,在App.xaml启动时,uri根本没有定义。

注意:Bug已确认

我注意到ShowDialog设置了Application.MainWindow,当对话框结束时,它将其设置为null,并且由于此设置,在OnStartup或Startup事件中调用Modal Dialog后,StartupUri不起作用。

关于无效的uri或类似内容,没有任何错误或例外。

这个方法在没有在Startup事件或OnStartup中调用DialogBox的情况下工作,我认为在这个方法上调用showdialog会导致它的主窗口设置为过期窗口,并在此之后关闭。

4 个答案:

答案 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。