Мое приложение WPF все еще работает, если я открою другое окно - PullRequest
0 голосов
/ 12 июля 2009

Я пишу приложение WPF, используя набор инструментов mvvm.

В основных окнах у меня есть команда для кнопки, которая открывает другое окно, используя:

catView.ShowDialog();

Хорошо, я закрываю это окно (используя кнопку закрытия или X), и когда я закрываю главное окно, приложение все еще работает, и мне нужно его убить.

Если я не открою второе окно, приложение нормально выключится.

Почему, если я открою другое окно, я не смогу нормально закрыть приложение?

У меня есть это в кнопке закрытия второго окна:

this.DialogResult = true;
this.Close();

С другой стороны, я запускаю приложение следующим образом (путь инструментария mvvm):

Views.MainView view = new Views.MainView();
view.DataContext = new ViewModels.MainViewModel();
view.Show();

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 27 июля 2010

Нир верен, возможно, поток все еще работает в другом окне.

Это можно исправить, закрыв диспетчер потоков приложения при закрытии окна.

public Window1()
{
    InitializeComponent();

    // This line should fix it:
    this.Closed += (sender, e) => this.Dispatcher.InvokeShutdown();
}

Я рад, что меня поправили, если это не правильный способ делать вещи. Хотя у меня все получилось.

PS. Если ваше другое окно предназначено для запуска в другом потоке, прочитайте это Евгением Приступой: обкатка МОФ-приложение-с несколькими-UI-потоков

2 голосов
/ 13 июля 2009

Проблема, вероятно, не связана с открытием и закрытием окна, но что-то внутри этого окна.

Это обычно происходит, когда у вас еще один поток работает, когда вы закрываете приложение, проверьте все, что может создавать новый поток внутри кода окна (включая System.Threading.Thread, ThreadPool, BackgroundWorker и сторонние компоненты) перед закрытием приложения убедитесь, что все фоновые потоки закрыты (или, если вы не можете их закрыть, пометьте их как фоновые потоки).

Также ищите все, что может открыть другое (невидимое) окно, обычно используют оконные сообщения для невидимого окна в качестве механизма межпроцессного взаимодействия, снова ищите сторонний код, который может это делать.

1 голос
/ 12 июля 2009

Я не знаю, вызывает ли это вашу проблему или нет, но вам не нужно звонить на Close() во втором окне. Установка DialogResult автоматически закрывает окно.

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