Пользовательское диалоговое окно WPF приводит к закрытию окна оболочки сразу после вызова .Show

В ПОРЯДКЕ. Немного настройки.

У меня есть небольшое приложение на основе PRISM, использующее Unity.

Я создал класс (отдельно от основной программы, где находится окно оболочки), который содержит собственное окно WPF, которое появляется в виде диалогового окна во время выполнения обновления.

Класс копирует некоторые файлы (очень простые вещи, такие как PoC), и окно информирует пользователя о своем прогрессе.

Окно отображается модально (.ShowDialog();), поэтому оно блокирует поток во время выполнения обновления.

Обновление запускается из события ContentRendered.

Когда обновление завершается, в окне вызывается .Close().

Создается экземпляр этого класса и запускается процесс обновления (путем вызова общедоступной функции класса StartUpdate()) в событии OnStartup в файле App.xaml.cs основной программы.

После этого создается и запускается загрузчик.

Наконец, в классе загрузчика загружаются некоторые модули (они ничего не делают, кроме регистрации представления), а окно оболочки разрешается и отображается в переопределении InitializeShell.

Все довольно стандартно, за исключением того, что программа просто закрывается после выхода из InitializeShell. Если я не вызову .Close в классе средства обновления и позволю пользователю закрыть пользовательский диалог с помощью X, произойдет то же самое. Я также попытался показать диалог немодальным способом (просто .Show()), и остальная часть программы работает нормально. Однако процесс не блокируется, поэтому обновление произойдет после или во время загрузки основной программы. И это было бы бессмысленно. Я нашел несколько способов обойти это. Мне просто любопытно, может ли кто-нибудь объяснить поведение.

Правка: пример фрагмента кода: когда пользователь закрывает окно Window1, MainWindow никогда не загружается.

/// <summary>
/// Interaction logic for App.xaml. This is where the program starts.
/// </summary>
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        dialogWPF.Class1 c = new dialogWPF.Class1();

        c.Update();

        //After this, the program should continue as normal (Open the MainWindow window)
    }
}

/// <summary>
/// This is the code for Class1 that is called in App.xaml.cs
/// </summary>
public class Class1
{
    private Window1 _win;

    public Class1()
    {
        _win = new Window1();
    }

    public void Update()
    {
        _win.ShowDialog();
    }



}

person Hexum064    schedule 18.11.2013    source источник
comment
Не могли бы вы описать, что происходит в коде; это немного пушисто, и это немного трудно понять.   -  person satnhak    schedule 19.11.2013
comment
Измените режим выключения на явный   -  person Gayot Fow    schedule 19.11.2013
comment
Вам нужно обрезать его до примера кода, чтобы воспроизвести и опубликовать это.   -  person Alan    schedule 19.11.2013
comment
Может ли ваш диалог просто вернуть DialogResult вместо вызова Close(), я подозреваю, что, поскольку диалог создается первым, он становится приложением MainWindow, поэтому вызов close завершает процесс.   -  person sa_ddam213    schedule 19.11.2013
comment
Я должен проверить, установив явный режим выключения. Что касается возврата DialogResult, из окна на самом деле не возвращается никакой информации, это просто для того, чтобы пользователь знал, что происходит. Хотя я ожидаю, что это каким-то образом станет приложением MainWindow.   -  person Hexum064    schedule 20.11.2013
comment
Также опубликуйте код загрузчика.   -  person Suresh    schedule 21.11.2013


Ответы (1)


Просто предположение: вы устанавливаете окно оболочки в качестве главного окна приложения следующим образом:

Application.Current.MainWindow = shell;

в переопределении InitializeShell()? В противном случае диалоговое окно обновления может оказаться главным окном приложения и привести к завершению работы приложения после его закрытия.

person Marc    schedule 19.11.2013
comment
Да, у меня такая же оболочка установлена ​​в переопределении InitializeShell(). - person Hexum064; 20.11.2013