Как изменить StartupUri приложения WPF?

Я пытаюсь изменить приложение.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 должен загружаться, но это не так, в приложении.uri запуска xaml вообще не определен.

Примечание: Ошибка Подтверждена

Я заметил, что ShowDialog устанавливает приложение.MainWindow и когда диалог заканчивается, он возвращает значение null, и из-за этого параметра StartupUri не работает после вызова модального диалога в onstartup или Startup event.

нет ошибки или исключения о недопустимом uri или что-нибудь вроде что.

этот метод работает без вызова диалогового окна в Startup event или OnStartup, я думаю, что вызов showdialog в этом методе вызывает что-то вроде его mainwindow, установленного в expired window, и он выключается после этого.

4 ответов


У вас все еще есть StartupUri, указанный в XAML? Если да, удалите его и посмотрите, поможет ли это.MSDN Source

Если нет, вам может потребоваться подойти к этому по-другому: иметь свой диалог в качестве запуска, а затем с этого момента открыть другое окно на основе выбранного значения.


Akash, я столкнулся с этой проблемой, пытаясь реализовать 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>

в коде:

    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)


просто попробуйте в OnStartup ():

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);