C# 以编程方式使GUI更整洁?

C# 以编程方式使GUI更整洁?,c#,winforms,user-interface,C#,Winforms,User Interface,我目前正在为一个照顾寄养儿童的组织制定一个计划。他们的旧解决方案已经过时,而且不受支持,因此他们想要一个新的系统,可以承担管理部分的工作 这里我需要的帮助是,如何通过生成一个GUI使它看起来尽可能接近我手工制作的GUI 在这里,您可以看到我手工制作的GUI: 以下是与编程相同的GUI: 正如您所看到的,GUI的紧密程度有明显的不同。生成的一个看起来也不一样,因为他们希望所有字段都可以编辑(这就是为什么我必须更改GUI的制作方式) 我通过解释一个简单的XML文件来制作GUI: <?xml

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

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

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

以下是与编程相同的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;在所有控件进入的FlowLayout中的控件之间0

但是,我是否可以进一步缩短控件之间的距离,使它们更接近

下面是一个并列比较,旨在说明两者之间的差异有多大:

编辑

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

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;
        }
公共GroupBox CreateNewView(字符串路径、字符串标记) { XmlDocument xmlDoc=新的XmlDocument(); 加载(路径); DataBag info=Facade.GetFosterChild(EIdentifierType.CPR,令牌); XmlNodeList节点=xmlDoc.SelectNodes(@“/root/gui”); GroupBox gb=新的GroupBox(); foreach(节点中的XmlNode节点) { gb.Text=node.Attributes[“groupboxlabel”].Value; gb.AutoSize=true; FlowLayoutPanel=新的FlowLayoutPanel(); panel.AutoSize=true; panel.WrapContents=true; panel.FlowDirection=FlowDirection.TopDown; panel.Dock=DockStyle.Fill; panel.Padding=新的填充(0,0,0,0); 对于(int i=0;i 编辑2

根据请求添加另一段代码。把它放在一个粘贴箱链接中,因为有一点:S


控件的默认
边距为(3,3,3,3)。除了
FLP
的零
填充
之外,还应将控件的
边距
设置为零或您喜欢的值:

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;
}
开关(子项名称)
{
案例“文本框”:
字符串txtlab=child.Attributes[“label”].Value;
TextBoxControl txtctrl=新的TextBoxControl(txtlab);
txtctrl.Content=(String)info.Data[i];
txtctrl.SetDisplay((字符串)信息数据[i]);

txtctrl.Margin=新填充(1,1,1,1);//
我通过解释一个简单的XML文件来制作GUI
-所以,你试图重新创建WPF,但在winforms上。为什么不直接使用WPF呢?顺便说一句,WPF还支持自定义、样式和主题化?我个人认为右边的看起来更好。如果你想要更多/更少的边距,那么就通过编程来设置它。你真的需要指定您也在使用什么框架(WPF或WinForms?)@EdS.看起来真像WinForms@HighCore因为当我开始做这个项目的时候,我是在WinForms中做的,而客户突然想要快速完成。所以我不能真正重做WPF中已经得到的所有代码。还有一个问题,我从来没有使用过WPF,所以现在了解这一点,会是一个非常糟糕的时机。做一些事情g你自己并不意味着你在设计器中这样做,它意味着你不使用为你做的东西。使用你自己的逻辑而不是
FlowLayoutPanel
,通过code来放置你的控件。我在创建的每个控件中将边距设置为0;0;0;0。这意味着什么?它有帮助吗?(没有这样的设置)