0

除了创建自定义按钮、自定义文本框和自定义标签等,然后在应用程序的所有表单中使用这些控件,然后根据需要更改这些控件的默认颜色和字体之外,还有一个简单的方法吗?如何在包含多个表单的现有应用程序上实现这种类似 css 的功能?

顺便说一句,我知道我可以以编程方式打开每个 *.Designer.cs 文件,然后用“My.Namespace.My[Control]”搜索/替换“System.Windows.Forms.[Control]”的实例,但是我不确定在代码设置控件的字体和颜色以及类似属性的情况下这将如何工作。那么是否只是确保自定义控件覆盖所有相关的 getter 方法的问题?

4

2 回答 2

2

Windows 窗体不提供任何类型的皮肤。

一个简单的解决方法是在类上编写某种扩展方法Form

public static void ApplySkin(this Form form, Skin skin)
{
    foreach (Control ctrl in form.Controls)
    {
        if (ctrl is TextBox)
        {
            TextBox textBox = (TextBox)ctrl;
            textBox.BackColor = skin.BackColor;
            textBox.ForeColor = skin.ForeColor;
            textBox.Font = skin.Font;
            ...
        }
        else if (ctrl is ComboBox)
        {
            ComboBox comboBox = (ComboBox)ctrl;
            comboBox.BackColor = skin.BackColor;
            comboBox.ForeColor = skin.ForeColor;
            comboBox.Font = skin.Font;
            ...
        }
        else if (ctrl is ...)
    }
}
于 2013-04-14T02:54:32.973 回答
0

关于 Designer.cs 文件 - 您应该完全避免更改它们的代码。它们由设计师使用,并且出于某种原因而分开。

如果您确实想更改内容,在 Form CTOR 中,在调用 InitializeComponent() 之后,只需使用您想要的任何更改调用您自己的函数(更改属性值,例如颜色、委托等...)

如果您希望多个表单具有相同的样式(或功能),只需将此方法放在不同的类中,并通过将自身作为参数发送来让所有表单使用相同的方法。

现在,该方法当然不知道哪些控件位于哪些窗体上,因此您可以使用 Controls.Find(Form 方法之一)按名称定位控件。只需确保表单中的控件使用相同的约定正确命名(例如,所有列表框都将命名为 listBoxX,其中 X 是数字...)。

于 2013-04-14T00:47:59.990 回答