2009-02-11 3 views
1

Мой вопрос прост: насколько плохим является следующий фрагмент кода? Как будет вы не так ли?Насколько плохо следующий фрагмент?

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; 
    } 
} 

Дело было в том, что код не будет закрывать форму, но вместо того, чтобы показать другой компонент на нем, и множество, как справиться с этим (это мобильная платформа, поэтому, нажав кнопку OK на вершине генерирует событие закрытия). Это связано с тем, что показ нескольких форм (4 или 5) один за другим, пользователь делает мигание приложения, а также очень раздражает, а замена только компонентов намного плавнее. Эта модель работает, но кажется очень неприятной, и я хотел бы, чтобы более чистый способ справиться с этим.

Обновление: Я обновил образец кода, чтобы имена переменных были несколько тихими. Тем не менее, я убежден, что это ужасно, (а), но не уверен, сколько и что более важно, (б) как сделать это лучше.

Обновление 2: Итак, кажется, что код все еще немного загадочен.

Теперь вот что это за проблема: Я покажу пользователю форму, которая дает ему указания, что делать на нескольких языках. Он продолжит, нажав ОК в окне. Затем я прошу его язык, а затем несколько вопросов (где его/ее GPS и т. Д.), Как это. После того, как он сможет ответить на вопросы (это не займет больше нескольких секунд), я покажу ему заставку (я загружаю материал в отдельный поток тем временем), в котором есть изображение. Отображение этих форм один за другим заставляет все приложение запускаться медленно и заполняется лагами пользовательского интерфейса.

Вот что я делаю для того, чтобы обойти задержки: я помещал содержимое окон в панели и клал эти панели один на другой и скрывал каждый из них, но тот, который должен быть видимым пользователю. (current variable) Каждое из окон делает разные вещи, поэтому мне нужно также изменить обработчик окна closing. В этом коде часть, которая позволяет панели, имеет ту же функцию (handler1, handler2 и т. Д.) С частью, которая обрабатывает событие закрытия окна. Если аргументы равны null, он делает первый, если это не так (это значит, что он был вызван пользователем), он делает последнее.

Мне нужно решение для этого, чтобы я мог вставлять и удалять диалоги в любое время (порядок и указатели на функции хранятся в поле CONTROLS, и это кажется очень удобным, если вы действительно понимаете Хотя это никогда не бывает легко изменить весь контент формы, должен быть более простой способ сделать это, а также более приятный, вот что я ищу.

Надеюсь, на этот раз Я могу объяснить, как работает модель.

+0

Этот код является злом: P – LDomagala

+0

Предлагаю вам прочитать некоторые правила кодирования .NET или C#. Например, имя переменной.И я второй LDomagala ... – TimothyP

+0

Почему вы показываете пользователю 4 или 5 форм так быстро? – Malfist

ответ

1

как-то ваш код заставляет меня хотеть плакать, извините, я читаю его дважды, и все, что я знаю об этом, это то, что он «doesStuff» с «STATES».

, если вы действительно хотите некоторую помощь на этом вам придется работать над этим самостоятельно первым ...

2

Я думаю, что это могло бы быть теоретически можно сделать этот код более восхитительно отвлечением, угрожающе плутовским, добродушно jeopardous, жизнерадостно chancy и неосторожно причудливый, но это потребует серьезной мысли.

+0

спасибо, я думал, что я был единственным – LDomagala

+0

Для человека, который отметил это «оскорбительное»: http://stackoverflow.com/questions/135685/how-does-the-offensive-flag-work-in-stackoverflow - и обратите внимание, что исходный вопрос озаглавлен «Как плохо выглядит следующее ...», поэтому здесь есть элемент юмора, который вы, возможно, пропустили. –

+0

Ну, выбор слов может сделать ваш ответ на самом деле оскорбительным. Однако, к сожалению, это так. –

0

Использование, XML! Это понятно для человека!

Подробнее seriously-

Похоже, вы пытаетесь создать какой-то мастер настройки, поэтому я хотел бы начать с изучения этого. Что касается вашего конкретного решения, я, как правило, категорически отвергаю очень сильно против подхода «слоистой панели». Я делаю это, потому что я поддерживаю приложения, написанные людьми, которые нашли этот подход, или связанные с ним «скрытые вкладки с помощью элемента управления вкладками», чтобы быть хорошей идеей. Это не так, и сопровождающие будут проклинать ваше имя на долгие годы.

Это, как говорят, какие существуют альтернативы? Ну, одна из альтернатив - это то, что вы уже уволили из-за своего «мерцания». Я бы сказал, что, в общем, мерцание не так уж и важно для быстрого и грязного приложения. Это может быть хорошей идеей, чтобы убедиться, что ваше новое окно вызывается до закрытия старого. (Я предполагаю, что это возможно, я не разработал на мобильном устройстве.)

Другой вариант может быть менее злой версией ваших слоистых панелей. Вместо того, чтобы бросать полдюжины панелей в одну форму, создайте отдельный пользовательский элемент управления для каждой страницы мастера, а затем добавьте/удалите элементы управления пользователя в содержащую форму. Это может избежать вашего мерцания и окажется намного проще в обслуживании, потому что каждая страница находится под другим контролем. Это может также облегчить любую последующую функциональность кнопки «Назад» и сделать ваши структуры данных более естественными, потому что эти пользовательские элементы управления будут связаны с определенным логическим битом данных. Это все еще не идеально, но, вероятно, это достаточно хорошо для одноразового решения.

Третий метод, если вы предвидеть обширные модификации мастеров как продукт созревает, может быть обобщать создание ваших пользовательских элементов управления, определив их в более логичном/декларативно (например, с помощью XML). Если вы динамически генерировать здравые элементы управления, основанные на XML, то изменение панелей может быть столь же легко, как нырнуть в вашем XML и делать что-то вроде:

<Questions> 
    <Question type="Text"> <!-- generate a textbox for the answer field --> 
     Favorite Color: 
    </Question> 
    <Question type="Number" range="0-255"> <!-- Maybe this is a spinner --> 
     The answer to life, the universe, and everything: 
    </Question> 
</Questions> 

Вот только с верхней части моей головы, и полностью overkill для любого одноразового приложения, но это возможность.

0

Теперь позвольте мне предупредить об этом, сказав, что это может сработать, но это может быть не ответ на вашу реальную проблему - медленный и невосприимчивый пользовательский интерфейс, когда у вас много форм. Реальный ответ может состоять в том, чтобы просто идти вперед и делать все отдельные формы, но каждая форма загружает дочерние формы в фоновый поток, пока пользователь смотрит на первую форму.

Но, полагая, что вы все еще настроены на это, я бы начал с создания отдельного класса только для обработки стека/иерархии Panel. Назовите его PanelManager. Вы должны создать экземпляр PanelManager и связать его с основной формой, а затем добавить к нему панели (возможно, привязанные к строке) и установить порядок. В основной форме закройте обработчик вызова PanelManager.CloseCurrentPanel(), и если больше нет панелей для отображения, тогда пришло время закрыть основную форму.

Время для псевдокода! Вот краткая идея для класса, я оставлю его вам осуществить это:

public class PanelManager { 
// constructor 
public PanelManager (Form ownerForm); 

// short-cut properties 
public Panel this[int idx] 
{ get; set; } 

public int Index 
{ get; set; } 

// main functionality 

public int AddPanel (Panel p); 
public void SetPanelOrder (Panel p, int idx); 
public void RemovePanel (Panel p); 
public void RemovePanelAt (int idx); 

// shows the first Panel 
public void Show(); 

// shows Panel[idx] 
public void Show (int idx); 

// adds the panel to the top of the stack and displays it 
// returns the index of the panel 
public int AddPanelAndShow (Panel p); 

// hides the current panel, displays the one underneath it 
// returns false if there are no more panels 
public bool HideCurrentPanel(); 
} 

в конструкторе главной формы, создать его экземпляр новой PanelManager (это), а затем в обработчике события закрытия, вызовите панельManager.HideCurrentPanel(), а затем выясните, следует ли вам закрыть ее после этого.

+0

после того, как Greg D предложил, я реализовал модель, подобную вашей, но с лучшей расширяемостью (например, загружать и выгружать обратные вызовы для панели, где она может устанавливать свойства панели управления и т. Д.), И эта структура макета карты, похоже, работает нормально , Спасибо вам за помощь! – 2009-02-15 13:40:31