Ocqlarity Ответов: 3

Как открыть окно WPF, закрыть его, а затем открыть другое окно без закрытия приложения и без использования фреймовой навигации?


Приложение, которое я пишу, имеет шаг настройки при запуске, где я собираю необходимые конфигурации и пользовательские данные, прежде чем инициализировать свой Autofac DI. Потом закрыть окно с помощью вызова стандартной Window.Close() вызов.

Код, кажется, выполняется правильно, но следующее окно не хочет показывать. Похоже Window.Close() приводит к событию, которое переопределяет что-либо после того, как оно было вызвано.

Вот еще несколько кодов, чтобы пролить свет на то, что я делаю:

var connectionview = new ConnectionView(connectionViewModel);
var result = connectionview.ShowDialog();
if (result.messageResult == MessageDialogResult.No)
               return;

var bootstrapper = new Bootstrapper(tempConnectionContext);
Container = bootstrapper.Bootstrap();
_mainViewModel = Container.Resolve<MainWindowViewModel>();
MainWindow = new MainWindow(_mainViewModel);
MainWindow.Show();


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

Что я уже пробовал:

Я не думаю, что ищу в нужных местах.

3 Ответов

Рейтинг:
26

Graeme_Grant

Для MVVM вам нужно использовать прокси-службу, так как виртуальные машины не должны получать доступ к любому пользовательскому интерфейсу, включая windows. Я уже отвечал на этот вопрос в аналогичном вопросе.

Пожалуйста, проверьте мой ответ там, а не я перепечатываю его здесь: Как динамически изменять размер элемента списка в C# WPF?[^]

ОБНОВЛЕНИЕ:

Эта статья будет большим подспорьем для вас: Асинхронное программирование - асинхронность с самого начала[^]


Ocqlarity

Спасибо, работает как шарм, и это дает некоторые интересные дополнения.

Graeme_Grant

Рад слышать! :)

Кроме того, проверьте мой Статья тумблера WPF[^]... классное дополнение к любому приложению WPF!

Рейтинг:
1

Dave Kreskowiak

Как в Windows Forms, так и в WPF существует иерархия windows. Ваше окно запуска-это вершина дерева иерархии, а все остальные окна, которые появляются, являются дочерними, причем эти дети могут показывать свои собственные дочерние окна.

Как только вы закроете верхнее окно дерева, ваше приложение умрет вместе с ним. Итак, решение довольно простое. Вы установили неправильное окно в качестве окна запуска. Окна запуска всегда должны быть основной формой вашего приложения, а не формой входа в систему, а не диалогом настроек ...


Graeme_Grant

Но это означало бы, что ему придется нарушить правила MVVM, чтобы напрямую получить доступ к визуальному дереву из виртуальной машины. Тебе не нужно этого делать. Смотрите мой ответ и ссылку ниже для правильного пути.

PureNsanity

ОП сказал::

Цитата:ОП сказал:
Приложение, которое я пишу, имеет шаг настройки при запуске

Я бы не стал считать какой-либо запускающий или загрузочный код виртуальной машиной.

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

Ocqlarity

Привет Дэйв

Спасибо Вам за Ваш вклад. Хотя ваш ответ верен, Грэм прав, говоря, что я не хочу нарушать правила MVVM, и поэтому ответ, который вы предоставили, не подходит для моей ситуации. Однако я использовал вашу рекомендацию в другом проекте. Так что еще раз спасибо.

Рейтинг:
0

johannesnestler

Я думаю, что ваше приложение закрыто после закрытия главного окна. Поэтому либо не делайте первое окно главным окном (просто диалогом, как splashscreen), либо используйте ShutdownMode="OnExplicitShutdown"
для вас приложение