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

Я пытаюсь изменить App.cs и загружать файлы XAML WPF из кода позади, но он не работает так, как должен.

Независимо от того, что я пытаюсь установить как 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 startup uri совсем не определен.

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

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

Нет ошибок или исключений в отношении недействительного uri или что-то в этом роде.

Этот метод работает без вызова DialogBox в событии Startup или OnStartup, я думаю, что вызов showdialog для этого метода приводит к тому, что его основное окно устанавливается в окно с истекшим сроком действия и после этого отключается.

Ответы

Ответ 1

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

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

Ответ 2

Акаш, я столкнулся с этой проблемой, пытаясь реализовать LoginDialog так же, как ваш. В диалоговом окне нет ошибки, а поведение по дизайну.

Не ошибка. По умолчанию ShutdownMode Приложение - OnLastWindowClosed, поэтому как только первое окно будет закрыто ваше приложение начнет закрываться вниз! Перейдите в OnExplicitShutdown и он будет работать, но вам придется управлять отключением.

См. предыдущий вопрос StackOverflow: WPF ShowDialog немедленно возвращает null при втором вызове

Ответ 3

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

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

Ответ 4

вместо того, чтобы переопределять метод 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)