【问题标题】:How to set variable color for a Windows Forms color property如何为 Windows 窗体颜色属性设置可变颜色
【发布时间】:2017-03-24 13:21:21
【问题描述】:

我是初学者,觉得解决方法很简单,但是全网都找不到。

我正在寻找一种将表单和控件的背景颜色设置为某个颜色变量的方法,因此如果我将其值更改为例如绿色,则其背景颜色设置为 mainColor 的每个控件都将变为绿色,并且更改将显示在设计器中。

public class MainForm:Form
{
    public static Color mainColor=[some color];
    public static Color secColor=[some color];
    public Main()
    {
        InitializeComponent();
        BackColor=mainColor;
        control1.BackColor=secColor;
        control2.BackColor=secColor;
        control3.BackColor=secColor;
    }
}

通过更改 mainColor 和 secColor 来实现。控件已更改,但不会显示在设计器中。正确的做法是什么?

【问题讨论】:

  • 了解设计师的工作方式非常重要。它在设计时创建您的 base 类的实例。如果您在“属性”窗口中更改该基类的属性,那么您可以看到它。但是您的构造函数在设计时运行。那是行不通的,你必须先编译你的项目,这是一个先有鸡还是先有蛋的问题。 UserControl 可以做到这一点。

标签: c# winforms


【解决方案1】:

使用Colors 类。

public static Color redColor = Colors.Red;
public static Color greenColor = Colors.Green;
public static Color blueColor = Colors.Blue;
public static Color whiteColor = Colors.White;

这是可用颜色的调色板:

如果要创建新颜色,请使用Color.FromArgb();

查看this answer 了解有关新颜色的更多信息。

【讨论】:

  • 我的问题不是如何为变量赋值,而是如何通过代码设置属性值,并且更改将显示在设计器中,或者以其他方式为控件设置可变颜色.基本上我希望可以在我的应用程序中更改颜色而不必单独更改每个控件
  • 哦,对不起,我的错。您无法在设计器中查看更改,因为此代码仅在运行时执行。所以你应该从设计师本身定义主要颜色。单击一个控件,然后单击属性。
  • 但是通过我不能只设置恒定颜色的属性,有没有办法将它设置为可变颜色?
【解决方案2】:

是的,这就是所谓的数据绑定,它部分由设计器完成,部分由代码完成。

而不是声明

public static Color mainColor=[some color];

将其声明为属性:

    public Color MyColor
    {
        get
        {
            return myColor;
        }
        set
        {
            myColor = value;
        }
    }

在您的主窗体中,编辑您希望受此变量影响的每个控件,以将其颜色属性绑定到它。我将使用 Panel 作为示例控件,因此将一些 Panel 对象添加到您的表单中。然后在每个 Panel 对象的 Properties 面板中,单击 DataBindings 旁边的 +,然后单击 (Advanced) 旁边的空框。单击省略号 (...) 并选择 BackColor 属性。然后,在 Binding 下拉菜单下,选择 Add Project Data Source。在下一个对话框中选择 Object 并导航到您的表单,然后选择它。 Formatting and Advanced Binding 对话框中将出现一个属性列表,您可以选择您的属性 MyColor

请注意,为第一个面板创建此数据源后,您无需为每个面板重新创建它 - 只需引用您已经创建的那个。

然后,您可以通过更改程序中 MyColor 属性的值来更改执行此数据绑定的任何控件的 BackColor。它们都会一起改变。

您可能还需要安排该属性来广播它已更改的消息,因此将此行添加到 set() 方法中。

form1BindingSource.ResetBindings(false);

这样设置的方法看起来像这样。

set
{
    myColor = value;
    form1BindingSource.ResetBindings(false);
}

这告诉绑定源对象通知所有订阅者更新自己,并且每次更改 MyColor 属性时都会自动发生。

【讨论】:

  • 现在我已经尝试过了,但没有成功。我完全按照你写的做了,但颜色没有改变。是否需要另一个步骤?在 BackColor 属性中,有一个小符号显示它已绑定到我的表单绑定源中的 MyColor,但属性不会同步。
  • 您是否也在刷新表单或面板或任何显示颜色的对象?
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多