Контроллер приложения и Application.Run() — останавливают программу при завершении пользовательского интерфейса

#c# #mvp

#c# #mvp

Вопрос:

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

 namespace Ordering.UI.Workflow
{
    public static class ApplicationController
    {
        private static INavigationWorkflow instance;
        private static string navigationArgument;

        public static void Register(INavigationWorkflow service)
        {
            if (service == null)
                throw new ArgumentNullException();
            instance = service;
        }

        public static void NavigateTo(string view)
        {
            if (instance == null)
                throw new InvalidOperationException();
            instance.NavigateTo(view, Argument);
        }

        public static void NavigateTo(string view, string argument)
        {
            if (instance == null)
                throw new InvalidOperationException();
            navigationArgument = argument;
            NavigateTo(view);
        }

        public static string Argument
        {
            get
            {
                return navigationArgument;
            }
        }

    }
}
  

Класс NavigationWorkflow:

 namespace Ordering.UI.Workflow
{


public interface INavigationWorkflow
{
    void NavigateTo(string uri, string argument);
}

public class NavigationWorkflow : INavigationWorkflow
    {

    Form _mainForm;
    ProductScreen productScreen;

    public NavigationWorkflow() { }

    public NavigationWorkflow(Form mainForm)
    {
        _mainForm = mainForm;
    }

    public void NavigateTo(string view, string argument)
    {
        switch (view)
        {
            case "products":
                if (productScreen != null amp;amp; !productScreen.IsDisposed)
                {
                    productScreen.Close();
                    productScreen = null;
                }
                if (productScreen == null amp;amp; productScreen.IsDisposed)
                {
                    productScreen = new ProductScreen();
                }
                productScreen.Show();
                break;
        }
    }
}
 }
  

и в моем Program.cs я хочу сделать это:

 OrderScreen orderScreen = new OrderScreen();
orderScreen.Show();

NavigationWorkflow workflow = new NavigationWorkflow(orderScreen);
ApplicationController.Register(workflow);

Application.Run();
  

Но всякий раз, когда моя основная форма ( OrderScreen ) закрывается, основное приложение продолжает выполняться. Как я могу зарегистрировать свое событие закрытия с помощью Application.Run() ? Должен ли я создавать свой собственный ApplicationContext ? Есть ли какой-нибудь способ автоматически сделать это?

Ответ №1:

Application.Run() автоматически создает ApplicationContext. Вы можете получить ссылку на него с помощью приложения.Свойство ApplicationContext. Вызовите его метод ExitThread(), чтобы принудительно завершить цикл передачи сообщений.

Создание вашего собственного и передача его в Run() также возможно, но я не могу придумать никакого реального преимущества. Кроме того, что он служит базовым классом для вашего контроллера. Вызов метода Run() логически также принадлежит вашему контроллеру.

Комментарии:

1. Извините, что удалил мой последний.. Итак, вы говорите, что вызываете приложение. Запускать (форму) в Program.cs или ApplicationController? Если я вызову Application.Run() из метода регистра ApplicationController, будет ли он заблокирован?

2. Запуск (основная форма) делает это автоматически, без необходимости написания какого-либо кода. Да, Run() блокируется.