Как изменить 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)