有没有一种方法可以从通用对象列表中获取特殊对象

时间:2019-05-16 22:11:31

标签: c# winforms generics user-controls

我想用从抽象usercontrol继承的usercontrol填充面板。他们拥有的唯一普通超类是控制。

用于填充BaseShape和BaseFractal的代码是一种通用方法,要求提供一系列用于自身填充的控件。我想在面板旁边的字段上创建一个对象,它们的类型是用户在预览中单击的类型,并带有usercontrol属性的属性。我无法调用这些属性,因为BaseShape和BaseFractal没有它们的通用性。我想到创建具有所有这些属性的超类,以便我可以更改它们并忽略我不希望更改的属性。除了创建具有所有属性的超类的想法之外,还有其他方法吗?

Design drawing app

private void PopulatePanel(List<Control> controls, Panel panel, int controlsPerRow = 3)
       {
           if (Utility.Utility.IsNullOrDefault(controls) || Utility.Utility.IsNullOrDefault(panel) || controlsPerRow <= 0) return;
           panel.Controls.Clear();
           int widthBetweenControls = (int)(panel.Width * 0.05);
           int heightBetweenControls = (int)(panel.Height * 0.05);
           int heighthBetweenSideControl = (int)(panel.Height * 0.1);
           int widthBetweenSideControl = (int)(panel.Width * 0.1);
           int yCoord = heighthBetweenSideControl;
           int widthControl = (int)((panel.Width - 2 * widthBetweenSideControl - widthBetweenControls * (controlsPerRow - 1)) / controlsPerRow);
           int heightControl = (int)((panel.Height - 2 * heighthBetweenSideControl - heightBetweenControls * (controlsPerRow - 1)) / (controlsPerRow-1));
           for (int i = 0; i <= controls.Count / controlsPerRow; i++)
          {
               int xCoord = widthBetweenSideControl;
               for (int j = 0; j < controlsPerRow; j++)
               {
                   if (j + (i * controlsPerRow) == controls.Count) return;
                   Control c = controls.ElementAt(j + (i * controlsPerRow));
                   c.Width = widthControl;
                   c.Height = heightControl;
                  c.Location = new Point(xCoord, yCoord);
                panel.Controls.Add(c);
                xCoord += (j == controlsPerRow) ? (widthBetweenSideControl) : (widthBetweenControls + widthControl);
            }
            yCoord += (i >= controls.Count / controlsPerRow) ? (heighthBetweenSideControl) : (heightBetweenControls + heightControl);
        }
    }

    private void ShapeButon_Click(object sender, EventArgs e)
    {
        List<Control> controls = new List<Control>();
        foreach(Shape t in Enum.GetValues(typeof(Shape)))
        {
            BaseShape bs = ShapeFactory.CreateInstance(t);
            controls.Add(ShapeFactory.CreateInstance(t));
        }
        PopulatePanel(controls, selectPanel, 3);
    }

0 个答案:

没有答案
相关问题