19

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

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

注意:已确认错误

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

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

此方法无需在 Startup 事件或 OnStartup 中调用 DialogBox 即可工作,我认为在此方法上调用 showdialog 会导致其主窗口设置为过期窗口并在此之后关闭。

4

4 回答 4

20

Akash,我在尝试像您一样实现 LoginDialog 时遇到了这个问题。该对话框没有错误,但行为是设计使然。

不是错误。Application 的默认 ShutdownMode 是 OnLastWindowClosed,因此一旦第一个窗口关闭,您的应用程序就会开始关闭!更改为 OnExplicitShutdown 它将起作用,但您必须管理关机。

请参阅以前的 StackOverflow 问题:WPF ShowDialog 在第二次调用时立即返回 null

于 2010-05-13T00:41:30.160 回答
8

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

于 2009-12-22T11:52:41.550 回答
7

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

如果没有,您可能需要以不同的方式处理此问题:将您的 Dialog 作为您的启动,然后根据所选值打开另一个 Window。

于 2009-12-22T19:56:59.910 回答
6

只需尝试 OnStartup() :

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);
于 2012-07-25T12:16:05.580 回答