以编程方式使GUI更整洁?

时间:2015-01-30 23:34:19

标签: c# winforms user-interface

我目前正在为照顾寄养儿童的组织制定一项计划。他们的旧解决方案已经过时且不受支持,所以他们想要一个可以采用管理部分的新系统。

我在这里需要帮助的是如何制作一个我通过生成它制作的GUI,尽可能接近我手工制作的GUI。

在这里,您可以看到我手工制作的GUI:

GUI

这是与编程相同的GUI:

Programming GUI

正如您所看到的,GUI的紧密程度存在明显差异。生成的那个也看起来不同,因为他们希望所有字段都可编辑(我必须改变我制作GUI的原因)。

我通过解释一个简单的XML文件来创建GUI:

<?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

修改

根据要求,创建控件的代码:

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

1 个答案:

答案 0 :(得分:2)

控件带有默认Margin(3,3,3,3)。除了Padding的零FLP之外,您还应设置控件&#39; 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

  • ..或者他们是Autosize = false并且他们最低 Height是必要的。

您的图片显示4像素的差距。这是一个提示,不是2x3像素的默认边距高度是罪魁祸首,而是错误的UserControl.Height或2x 2像素。