我正在尝试创建一个基类来更改现有表单的用户界面。 我刚刚开始开发该类并具有以下代码:
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。
答案 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;
}
}