#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() блокируется.