Как изменить StartupUri приложения WPF? - PullRequest
16 голосов
/ 22 декабря 2009

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

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

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

Нет ошибок или исключений в отношении недопустимого URI или чего-либо подобного.

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

Ответы [ 4 ]

18 голосов
/ 13 мая 2010

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

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

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

6 голосов
/ 25 июля 2012

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

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);
5 голосов
/ 22 декабря 2009

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

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

5 голосов
/ 22 декабря 2009

вместо переопределения метода 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...