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

如何更改WPF应用程序的StartupUri?,wpf,uri,startup,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 LoginDia

我正试图修改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”不起作用

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

注意:错误已确认

我注意到ShowDialog设置Application.main窗口,当对话框结束时,它将其设置回null,并且由于此设置,在OnStartup或Startup事件中调用模式对话框后,StartupUri不起作用

关于无效uri或类似的内容,没有错误或异常


此方法在启动事件或OnStartup中不调用DialogBox的情况下工作,我认为在此方法上调用showdialog会导致其主窗口设置为expired window,然后关闭。

与其重写OnStartup()方法,不如挂接到事件中

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;
        }
    }
}
在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>

这只是我的测试用例,我已经验证了它是否正确执行(随机:D)

您是否仍然在XAML中指定了StartupUri?如果是这样,请将其移除,看看是否有帮助


如果没有,您可能需要采用不同的方法:将您的对话框作为启动,然后从那时起根据选定的值打开另一个窗口。

阿卡什,我在尝试实现与您一样的LoginDialog时遇到了这个问题。对话框没有bug,但其行为是经过设计的

不是虫子。的默认关闭模式 应用程序仅限WindowClosed,因此 第一扇窗户一关上 您的应用程序将开始关闭 趴下!更改为OnExplicitShutdown和 它会起作用,但你必须这样做 管理关机

请参阅前面的StackOverflow问题:

只需在OnStartup()中尝试即可:


很抱歉,它不起作用,事实上你的方法是随机的,我的方法是一个对话框,看起来启动事件中的对话框导致了问题。我只是在我的示例中加入了一个MessageBox.Show(“test”)调用,它仍然起作用。我怀疑您的LoginDialog总是返回false,或者与LoginDialog内部相关的其他错误。不,调试和逐步执行我可以看到它工作正常。我无法复制您的问题。我可以验证是否调用了我的代码(尽管是随机调用的),但是否以编程方式更改了StartupUri。试着为你的switch语句设置一个默认结果,并检查它是否以某种方式通过。我按照Joel所说的做了,它正在工作,但不知何故我觉得这是一个错误,我将对话框设置为启动,然后根据对话框结果在单击“确定”按钮时加载窗口。我完全按照你说的做了,不过这是一些解决方法,但从应用程序设计的角度来看,设置StartupUri应该是可行的,而且看起来没有什么好代码,很容易记录和解释。谢谢你的建议。哇,我不知道这个,很好的答案,我会尝试使用这个,看看它是否有效。
StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);