如何使用基类设置Control和WinForm样式?

时间:2015-03-19 11:20:16

标签: c# winforms user-interface inheritance

我正在尝试创建一个基类来更改现有表单的用户界面。 我刚刚开始开发该类并具有以下代码:

public class UI_1:Form
{        
    public UI_1()
    {
        FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;  
        Font = new System.Drawing.Font("Segoe UI", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        BackColor = System.Drawing.SystemColors.HotTrack;        

    }
}

public partial class Form_LoginNew : UI_1
{    
    public Form_LoginNew()
    {
    }
}

我将继承此基类到我现有的表单(Form_LoginNew),如上所示。在测试时,设置/更新“FormBorderStyle”......但是“BackColor”& “字体”不会更改。为什么它不起作用?

另外,请告诉我如何使用此基类更改(按钮,标签..等)的控件样式。请记住,表格和控件已经存在。另外,我不能使用WPF。

2 个答案:

答案 0 :(得分:2)

创建原始表单时,很可能是使用设计器构建的。

使用BackColor作为示例,如果在设计器中更改了此项,则会在派生类的InitializeComponent中发生(在调用基类构造函数之后),因此无论您在那里设置了什么实际上被忽略了。

您可以在基类中执行类似的操作

public override System.Drawing.Color BackColor
{
    get
    {
        return System.Drawing.SystemColors.HotTrack;
    }   
    set
    {
        // Don't do anything here
    }
}

如果您尝试这样做,您会发现无法在设计器中更改派生表单的BackColor,因为setter不会执行任何操作。

关于你的问题

  

另外,请告诉我如何使用此基类更改(按钮,标签..等)的控件样式。请记住,表格和控件已经存在。另外,我不能使用WPF。

您可以创建自己的ControlsCollection,如下所示:

public class MyControlCollection : Control.ControlCollection
{
    public MyControlCollection(Control owner) : base(owner)
    {
    }

    public override void Add(Control value)
    {
        // Modify whatever type of control you want to here
        if (value is Button)
        {
            // As an example, I will set the BackColor of all buttons added to the form to red
            Button b = (Button)value;
            b.BackColor = Color.Red;
        }
        base.Add(value);
    }
}

要在基类中使用它,您只需覆盖CreateControlsInstance方法:

protected override Control.ControlCollection CreateControlsInstance()
{
    return new MyControlCollection(this);
}

答案 1 :(得分:2)

我建议不要尝试使用继承设置样式,而是推荐一组可以为您应用样式的扩展方法。

当我试一试并创建一个继承FormThatNeedsStyle形式的表单时,我在FormThatNeedsStyle的构造函数中设置的样式正在运行(即使在设计器中)。

public partial class FormThatNeedsStyle : Form
{
  public FormThatNeedsStyle()
  {
    InitializeComponent();
    this.Style();
  }
}

// Extension method class to apply styles
public static class Styles
{
  public static void Style(this Form form)
  {
    form.BackColor = Color.HotPink;

    foreach (var control in form.Controls)
    {
      // Apply desired styles to controls within the form
      if (control is Button)
        (control as Button).Style();
    }
  }

  public static void Style(this Button button)
  {
    button.FlatStyle = FlatStyle.Flat;
  }
}