Как отобразить объекты с помощью пользовательского интерфейса - PullRequest
0 голосов
/ 18 июля 2011

У меня есть следующая реализация класса (не полная, просто чтобы дать представление)

   public class MySwitch{
        Command command = Command.Red;
        public Command GetNext() {
            command = GetNext(command); // circular enum values
            return command;
        }
    }


public enum Command { Red =0, Blue=1, Green=2}

public class LED {
    public void Glow(Command command){
        this.setColor(ColorForm(command));
        this.Glow();
    }
}

public class Commander {
    public Commander(LED target, MySwitch source){
        this.LED = LED;
        this.MySwitch = MySwitch;
    }

    public void Execute(){
        this.LED.Glow(this.MySwitch.GetNext());
    }
}

Я хочу, чтобы эти объекты отображались в элементы пользовательского интерфейса.Учтите, у меня есть приложение win form, где переключатель и светодиод - это две панели, где я хочу, чтобы GDI рисовал их.

Проблема в том, как лучше всего синхронизировать объекты с элементами пользовательского интерфейса.Возможные варианты:

  1. Создать элемент пользовательского интерфейса, унаследованный от панели, и должен содержать один экземпляр объекта.

  2. Создать элемент пользовательского интерфейса (скажем, LEDUI), унаследованный отBO, и должен содержать контейнер (панель) для рисования и реализации метода рисования с использованием this.Color (например, светодиод) - это приведет к кону файла 2 * BO

  3. Сохранить элемент пользовательского интерфейса иBO отделяют и позволяют ведущему быть мостом между ними.

  4. Реализуйте метод на самом BO для рендеринга (при условии единого пользовательского интерфейса) на winform.Поскольку он не может быть добавлен непосредственно к winform, создайте объект CustomForm, который позволяет добавлять такие элементы (предположим, IMyObj), и вызовите CustomFOrm.Render(), который в конечном итоге вызовет метод render всех childElements.Почти так же, как визуализируются форма и элементы управления.

  5. Любой другой способ

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

EDIT

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

Ответы [ 2 ]

0 голосов
/ 18 июля 2011

В C # (ну, WinForms) каждый элемент пользовательского интерфейса имеет Tag член, в который вы можете поместить все, что захотите. Таким образом, когда пользователь нажимает «переключатель», код может перебирать элементы управления в поисках элементов управления с Tag, который соответствует текущему выбору.

Например, предположим, что светодиодные изображения имеют текст 'LED =' в их поле Tag, тогда вы можете написать функцию для установки состояния свечения:

// example usage: SetGlow ("Red");

void SetGlow (string colour)
{
   SetGlow (Controls, colour);
}

void SetGlow (ControlContainer controls, string colour)
{
  foreach (Control control in controls)
  {
    if (control.Tag is a string) // syntax escapes me
    {
      string tag = (string) control.Tag;
      if (tag.StartsWith ("LED="))
      {
        if (tag == ("LED=" + colour))
        {
          // enable glow
        }
        else
        {
          // disable glow
        }
      }
    }

    SetGlow (control.Controls, colour);
  }
}
0 голосов
/ 18 июля 2011

Меня всегда учили, что ссылки идут до наследования, что если вам не нужно обращаться к защищенным членам определенного класса, вам лучше создать объект этого типа в своем классе, чем наследовать весь класс (поправьте меня, пожалуйста если я не прав).

в этом свете вариант 3 кажется мне лучшим.

...