Мой вопрос прост: насколько плох следующий фрагмент кода? Как бы ты сделал это?
CancelEventHandler _windowClosing;
private CancelEventHandler WindowClosing
{
set
{
clearEventHandlerList();
this.Closing += value;
_windowClosing = value;
/*
* if calling the method with null parameters,
* it will set up itself as the primary control on the Window
*/
_windowClosing(null,null);
}
get
{
return _windowClosing;
}
}
private readonly CancelEventHandler[] CONTROLS = null;
private int current = 0;
public InitializerForm()
{
InitializeComponent();
/*
* these are the handlers for the different controls,
* in the order of appereance to the user
*/
STATES = new CancelEventHandler[] { handler1, handler2, etc. };
WindowClosing = CONTROLS[0];
}
private void clearEventHandlerList()
{
foreach (CancelEventHandler c in CONTROLS)
{
this.Closing -= c;
}
}
private void handler1(object obj, CancelEventArgs e)
{
if (obj == null)
{
//hide every other control, but this one, also set up if necessary
}
else
{
//do something
WindowClosing = CONTROLS[++current]; // set the next control to show
e.Cancel = true;
}
}
Дело в том, что код не будет закрывать форму, а вместо этого показывать на ней другой компонент, а также задавать способ обработки (это мобильная платформа, поэтому нажатие кнопки ОК в верхней части создает событие закрытия ). Это происходит потому, что отображение нескольких форм (4 или 5) одна за другой для пользователя заставляет приложение мигать, а также очень раздражает, в то время как замена только компонентов намного плавнее. Эта модель работает, но кажется очень неприятной, и я бы хотел более чистый способ справиться с этим.
Обновление:
Я обновил пример кода, чтобы имена переменных были довольно понятными. Тем не менее, я убежден, что это ужасно, (а) но не уверен, насколько, и что более важно, (б) как сделать это лучше.
Обновление 2:
Так что, похоже, код все еще немного загадочный.
Теперь вот в чем проблема:
Я показываю пользователю форму, которая инструктирует его, что делать на нескольких языках. Он продолжает, нажимая OK в окне. Затем я спрашиваю его язык, а затем несколько вопросов (где его / ее GPS и т. Д.), Как это. После того, как он смог ответить на вопросы (это не должно занимать больше нескольких секунд каждый), я показываю ему заставку (я загружаю вещи в отдельном потоке), на которой есть картинка. Отображение этих форм одна за другой замедляет запуск всего приложения и заполняет лаги пользовательского интерфейса.
Вот что я делаю, чтобы обойти лаги: я помещаю содержимое окон в панели, помещаю эти панели одну на другую и скрываю каждую из них, кроме той, которая должна быть видна пользователю. (current
переменная) Каждое из окон делает разные вещи, поэтому мне нужно дополнительно изменить обработчик события окна closing
. В этом коде часть, которая включает панель, выполняет ту же функцию (handler1
, handler2
и т. Д.), Что и часть, которая обрабатывает событие закрытия окна. Если аргументы null
, он делает первое, если это не так (это означает, что он был вызван пользователем), он делает второе.
Мне нужно расширяемое решение для этого, чтобы я мог вставлять и удалять диалоги в любое время (порядок и указатели на функции хранятся в поле CONTROLS
, и это, кажется, очень удобно, если вы на самом деле понять это. Хотя изменить содержание всего бланка никогда не бывает легко, для этого должен быть более простой и приятный способ, именно это я и ищу.
Надеюсь, на этот раз я смог объяснить, как работает модель.