2015-01-30 16 views
1

В настоящее время я разрабатываю программу для организации, которая заботится о приемных детей. Их старое решение устарело и не поддерживается, поэтому им нужна новая система, которая может взять на себя часть управления.Сделать программным обеспечением GUI программным путем?

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

Здесь вы видите графический интерфейс, который я сделал вручную:

GUI

Вот тот же графический интерфейс сделанный с программированием:

Programming GUI

Как вы можете видеть, что есть четкое различие в том, как выглядит GUI. Созданный тоже выглядит по-другому, потому что они хотели, чтобы все поля редактировались (причина, по которой мне пришлось изменить способ создания GUI).

Я делаю графический интерфейс, интерпретируя простой XML-файл:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <gui groupboxlabel="Barnets Stamdata" type="CHILD"> 
     <textbox label="CPR" /> 
     <textbox label="Navn" /> 
     <textbox label="Efternavn" /> 
     <textbox label="Addresse" /> 
     <textbox label="Hus nr." /> 
     <textbox label="Opgang" /> 
     <textbox label="Post Nr." /> 
     <textbox label="By" /> 
     <textbox label="Email" /> 
     <textbox label="Telefon nr." /> 
     <textbox label="Sagsbehandler" /> 
     <textbox label="Konsulent" /> 
     <textbox label="Aflastning" /> 
     <combobox label="Foranstaltning" /> 
     <datetimepicker label="Anbring" /> 
     <datetimepicker label="Udskriv" /> 
    </gui> 
</root> 

Я хотел бы знать, как я делаю сгенерированный GUI аккуратнее и более компактным, как я впервые сделал вручную в IDE? Или как можно ближе. Я уже установил свойство Margin равным 0; 0; 0; 0 между элементами управления в FlowLayout, в которые входят все элементы управления.

Но могу ли я уменьшить расстояние между элементами управления еще больше, чтобы они приблизились друг к другу?

Вот изображение бок о бок как раз, чтобы понять, насколько велика разница есть:

side by side

EDIT

В соответствии с просьбой, код, который создает элементы управления:

public GroupBox CreateNewView(String path, String token) 
     { 
      XmlDocument xmlDoc = new XmlDocument(); 
      xmlDoc.Load(path); 

      DataBag info = Facade.GetFosterChild(EIdentifierType.CPR, token); 

      XmlNodeList nodes = xmlDoc.SelectNodes(@"/root/gui"); 
      GroupBox gb = new GroupBox(); 
      foreach (XmlNode node in nodes) 
      { 
       gb.Text = node.Attributes["groupboxlabel"].Value; 
       gb.AutoSize = true; 

       FlowLayoutPanel panel = new FlowLayoutPanel(); 
       panel.AutoSize = true; 
       panel.WrapContents = true; 
       panel.FlowDirection = FlowDirection.TopDown; 
       panel.Dock = DockStyle.Fill; 
       panel.Padding = new Padding(0, 0, 0, 0); 

       for (int i = 0; i < node.ChildNodes.Count; i++) 
       { 
        XmlNode child = node.ChildNodes.Item(i); 
        switch (child.Name) 
        { 
         case "textbox": 
          String txtlabel = child.Attributes["label"].Value; 
          TextBoxControl txtctrl = new TextBoxControl(txtlabel); 
          txtctrl.Content = (String)info.Data[i]; 
          txtctrl.SetDisplay((String)info.Data[i]); 
          panel.Controls.Add(txtctrl); 
          panel.Width = txtctrl.Width; 
          break; 
         case "combobox": 
          String combolabel = child.Attributes["label"].Value; 
          ComboBoxControl comboctrl = new ComboBoxControl(combolabel, (String[])info.Data[i]); 
          comboctrl.Content = (String[])info.Data[i]; 
          comboctrl.SetDisplay(0); 
          panel.Controls.Add(comboctrl); 
          panel.Width = comboctrl.Width; 
          break; 
         case "datetimepicker": 
          String datelabel = child.Attributes["label"].Value; 
          DateTimeControl datectrl = new DateTimeControl(datelabel, (DateTime)info.Data[i]); 
          panel.Controls.Add(datectrl); 
          panel.Width = datectrl.Width; 
          break; 
         case "#comment": 
          break; 
         default: 
          Console.WriteLine("No Tag Found"); 
          break; 
        } 
       } 
       gb.Controls.Add(panel); 
      } 
      return gb; 
     } 

РЕДАКТИРОВАТЬ 2

Добавить другой фрагмент кода в соответствии с запросом. Положите его в ссылку Pastebin, потому что есть немного больше: S

http://pastebin.com/qtPRLgNK

+6

'Я создаю GUI, интерпретируя простой XML-файл'. Итак, вы пытаетесь изобрести WPF, но на winforms. Почему бы просто не использовать WPF, а BTW также поддерживает настройку, стилизацию и тематику? –

+1

Лично я думаю, что один справа выглядит лучше. Если вы хотите больше/меньше поля, тогда просто установите его программно. Вам действительно нужно указать, какую инфраструктуру вы используете (WPF или WinForms?) –

+2

@EdS. Это точно * выглядит * как WinForms – BradleyDotNET

ответ

2

управления поставляются с умолчанию Margin из (3, 3, 3, 3).В дополнение к нулю Padding от FLP вы должны установить контроль Margins до нуля или значения, которые вы любите:

switch (child.Name) 
{ 
    case "textbox": 
     String txtlabel = child.Attributes["label"].Value; 
     TextBoxControl txtctrl = new TextBoxControl(txtlabel); 
     txtctrl.Content = (String)info.Data[i]; 
     txtctrl.SetDisplay((String)info.Data[i]); 
     txtctrl.Margin = new Padding(1, 1, 1, 1); // <---- or whatever you like 
     panel.Controls.Add(txtctrl); 
     panel.Width = txtctrl.Width; 
     break; 
    case "combobox": 
     String combolabel = child.Attributes["label"].Value; 
     ComboBoxControl comboctrl = new ComboBoxControl(combolabel, 
                 (String[])info.Data[i]); 
     comboctrl.Content = (String[])info.Data[i]; 
     comboctrl.SetDisplay(0); 
     comboctrl.Margin = new Padding(1, 1, 1, 1); // <---- or whatever you like 
     panel.Controls.Add(comboctrl); 
     panel.Width = comboctrl.Width; 
     break; 
    case "datetimepicker": 
     String datelabel = child.Attributes["label"].Value; 
     DateTimeControl datectrl = new DateTimeControl(datelabel, 
                 (DateTime)info.Data[i]); 
     datectrl.Margin = new Padding(1, 1, 1, 1); // <---- or whatever you like 
     panel.Controls.Add(datectrl); 
     panel.Width = datectrl.Width; 
     break; 
    case "#comment": 
     break; 
    default: 
     Console.WriteLine("No Tag Found"); 
     break; 
} 

Upadte:

Как ваш Controls фактически UserControls, убедитесь, что они либо

  • ли Autosize = true и все встроенные Controls имеют нулевой Margin

  • ..or они Autosize = false и у них минимумHeight необходимо держать их всех.

Изображение Изображение показывает зазор 4 пикселей. Это намек на то, что не по умолчанию высота поля 2x 3 пикселя является виновником, а неправильным UserControl.Height или 2x2 пикселями.

+0

Я установил маржу в 0; 0; 0; 0 в каждом отдельном элементе управления, который создан. – OmniOwl

+0

Смысл что? Помогает ли это? (В коде, который вы отправили, нет такой настройки.) – TaW

+0

Я думал, что упомянул об этом ..? В любом случае, отдельные элементы управления имеют значение Margin, равное 0; 0; 0; 0 (в собственном коде, который не отправлен), поэтому мне не нужно было это делать, когда я сгенерировал GUI. – OmniOwl

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