2016-01-19 3 views
1

Я создаю приложение Windows Form, которое в основном является воссозданием краски. У меня есть инструментальная панель различных кнопок, я могу перетащить копию растрового изображения на диаграмму и поместить ее на панель чертежа. Однако я хочу добавить функциональность, позволяющую перемещать растровое изображение вокруг панели и изменять его размер, используя 9 узлов по углам и середине линий.Синглтон или статический класс или нет?

В настоящее время моя форма имеет

List<Diagram> theDiagrams; 

, который содержит список пользовательских диаграмм объектов. Каждая диаграмма представляет растровое изображение на панели чертежа, оно имеет координаты, размер, z-индекс, растровое изображение и немного другой информации. Однако теперь я хочу, чтобы только диаграмма с фокусом могла быть доступна для редактирования или иметь эти 9 узлов вокруг снаружи с возможностью перемещения/изменения размера. Я думаю о создании класса, который является деривацией класса Diagram, который у меня есть, но я хочу только создать один из них. Должен ли я создавать статический класс или, возможно, использовать шаблон одноэлементного дизайна, чтобы гарантировать, что только один из этих объектов может быть создан за один раз. В идеале я бы хотел, чтобы этот класс был пустым с самого начала и только когда он был необходим, нужно установить копию диаграммы.

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

Если вы не поняли мой вопрос, следует ли использовать шаблон дизайна singleton, статический класс или ни то, что я пытаюсь выполнить?

ответ

2

В этом случае я бы избегал статических и одноэлементных паттернов. Что делать, если у вас более 1 формы (приложение MDI)

Выбранный растровый/слой является чем-то вроде свойства вашего изображения/формы, ни один модуль или класс не могут изменять его напрямую. Ваш класс изображения контролирует List<Diagram>


Я думаю, вы должны иметь private Diagram selectedDiagram; поля, содержащие текущую выбранную схему, определенную в том же управлении/форме, содержащую List<Diagram> theDiagrams поля.

При составлении полного списка вы должны пропустить выбранную и нарисовать ее как последнюю диаграмму. (Так он будет верхним)

Просто идея ....

ПСЕВДО

private void UpdateBitmap() 
{ 
    foreach(var diagram in theDiagrams) 
    { 
     if(diagram == selectedDiagram) 
      continue; 

     // draw 
    } 

    if(selectedDiagram != null) 
    { 
     // draw with corner nodes and/or other helper controls (z-top) 

     // does the corner nodes and/or other helper controls exists? 
     if(!areEditControlsCreated) 
      CreateEditControls(); 

    } 
    else 
    { 
     if(areEditControlsCreated) 
      DestroyEditControls(); 

    } 
} 

и когда вы отмените диаграмму, просто снимите selectDiagram = null; поле и перерисовки растровых изображений.

Смежные вопросы