В ПОРЯДКЕ. Немного настройки.
У меня есть небольшое приложение на основе 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();
}
}
DialogResult
вместо вызоваClose()
, я подозреваю, что, поскольку диалог создается первым, он становится приложением MainWindow, поэтому вызов close завершает процесс. - person sa_ddam213   schedule 19.11.2013