C# 为什么赢了';这个代码是否只在点击按钮时加载运行?

C# 为什么赢了';这个代码是否只在点击按钮时加载运行?,c#,winforms,c#-4.0,onclick,onload-event,C#,Winforms,C# 4.0,Onclick,Onload Event,我有以下工具。底部的预设是从XML文件加载的。但是,我不能在加载时将渐变应用于预设(标签),只有当按钮调用代码时 请参见下面的“加载”和“单击”按钮: 表单名为Main,相关代码如下所示: private void Main_Load(object sender, EventArgs e) { Stop1.BackColor = Gradient.ForeColor; Stop2.BackColor = Gradient.BackColor; Populate(Gra

我有以下工具。底部的预设是从XML文件加载的。但是,我不能在加载时将渐变应用于预设(标签),只有当按钮调用代码时

请参见下面的“加载”和“单击”按钮:

表单名为Main,相关代码如下所示:

private void Main_Load(object sender, EventArgs e)
{
    Stop1.BackColor = Gradient.ForeColor;
    Stop2.BackColor = Gradient.BackColor;
    Populate(Gradient.ForeColor);

    // If XML exists etc snipped
    XmlDoc = XDocument.Load("palette.xml");

    IEnumerable<XElement> cssGM = XmlDoc.Root.Elements();
    Label[] Label = new Label[cssGM.Count()];

    for(int i = 0; i < cssGM.Count(); i++)
    {
        Label[i] = new Label();
        Label[i].Name = "Saved" + i.ToString();
        Label[i].ForeColor = ColorTranslator.FromHtml(cssGM.ElementAt(i).Elements().ElementAt(0).Elements().ElementAt(1).Value);
        Label[i].BackColor = ColorTranslator.FromHtml(cssGM.ElementAt(i).Elements().ElementAt(1).Elements().ElementAt(1).Value);
        Label[i].BorderStyle = BorderStyle.FixedSingle;
        Label[i].Location = new System.Drawing.Point(i*54+2, 0);
        Label[i].Size = new System.Drawing.Size(50, 50);
        SavedPanel.Controls.Add(Label[i]);
        //FillGradient(Label[i]);
        //Label[i].Invalidate();
        //SavedPanel.Refresh();
    }

    FillPalettes();
    //Application.DoEvents();
    //this.Invalidate();
}

public void FillPalettes()
{
    foreach(Label Palette in this.SavedPanel.Controls.OfType<Label>())
    {
        FillGradient(Palette);
    }
}

public void FillGradient(Label Target)
{
    Graphics e = Target.CreateGraphics();
    e.FillRectangle(new LinearGradientBrush(new Point(0, 0), new Point(0, Target.Height), Target.ForeColor, Target.BackColor), ClientRectangle);
}

private void button1_Click(object sender, EventArgs e)
{
    FillPalettes();
}
private void Main\u加载(对象发送方,事件参数e)
{
Stop1.BackColor=Gradient.ForeColor;
Stop2.BackColor=Gradient.BackColor;
填充(渐变、前景色);
//如果存在XML,则删除etc
XmlDoc=XDocument.Load(“palete.xml”);
IEnumerable cssGM=XmlDoc.Root.Elements();
Label[]Label=新标签[cssGM.Count()];
对于(int i=0;i
我已经把我试过的东西注释掉了。另外,我知道选择XML节点的方法非常简单。。。这是我需要花时间去解决的问题。以下是XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- cssGM - Gradient palette data -->
<cssGM Version="0.3">

  <Gradient name="White to Black">>
    <Stop>
      <Location>0</Location>
      <Colour>#fffffa</Colour>
    </Stop>
    <Stop>
      <Location>100</Location>
      <Colour>#000001</Colour>
    </Stop>
  </Gradient>
  ...

>
0
#FFFFF A
100
#000001
...

表单
已加载
事件在表单布局之前触发,可能所有控件尚未就绪

您可以尝试使用显示的
事件,因为此时所有控件都应该准备好了

    private void Main_Shown(object sender, EventArgs e)
    {
        // all your code;
    }
据我记忆所及,在美好的winform时代,事件的顺序是这样的

  • 装载
  • CreateControl
  • 激活
  • 显示
  • 油漆

  • 您需要等待
    CreateControl
    事件来创建
    SavedPanel
    ,因此显示的
    事件应该可以。

    或者,创建从标准
    标签继承的您自己的类:

    public class GradientLabel : Label {
        protected override void OnPaint(PaintEventArgs e) {
            e.Graphics.FillRectangle(new LinearGradientBrush(new Point(0, 0), new Point(0, this.Height), this.ForeColor, this.BackColor), ClientRectangle);
        }
    }
    
    然后,它会不断地被画出来。无论何时更改
    渐变标签的
    背景色
    前景色
    属性,它都会自动更新:

    gradientLabelInstance.BackColor = Color.Green;
    

    Main_Load是否实际连接到窗体的Load事件?(也可以替代OnXXX方法,而不是挂接您自己对象的事件。)@Sahuagin是的,它已挂接到事件。使用所示的
    事件具有完全相同的结果。请记住,渐变标签是在for(int i=0;i
    循环中以编程方式创建的。我想这与此有关。这非常有效,它以一种简单的方式解释了我如何继续编写代码。非常感谢Simony欢迎您:)如果您正在寻找,我将有兴趣代表我的设计师/前端朋友帮助使用此小应用:)感谢您的提议Simon,我一定会记住这一点!我对今后的发展方向有很多想法。比一个小小的渐变器更大的东西;)