在 WinForms.NET 的 CreateParams 中使用传递给表单构造函数的参数

Use parameter passed to form constructor in CreateParams in WinForms.NET

我有一个这样定义的自定义表单:

internal class DropDownForm : System.Windows.Forms.Form
{
    public DropDownForm(bool needShadow)
    { ... }
}

我需要根据传递给覆盖的 CreateParams 成员中的表单构造函数的 needShadow 参数来启用表单阴影 - 如下所示:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;

        if (needShadow)
            cp.ClassStyle |= CS_DROPSHADOW;

        return cp;
    }
}

问题是我无法访问此 CreateParams 中传递给 表单构造函数 needShadow 参数。 CreateParams 成员 在我的自定义表单 构造函数 中的第一条语句 之前执行,我无法缓存 needShadow 值传递给表单字段中的表单构造函数,以便稍后在 CreateParams.

中使用它

为了解决这个问题,我可以把这个 needShadow 参数变成我表单的 static 属性,在创建表单之前设置它并使用它覆盖 CreateParams 中的值。但显然这不是一个好方法,因为我的应用程序可以创建此表单的多个实例,每个实例都有自己的 needShadow 值。

在 WinForms .NET 中是否有解决此问题的巧妙方法?

好吧,CreateParams 会被调用 几次 。第一次调用将由 Form() 构造函数进行,甚至没有 Handle 创建 这就是为什么你可以安全地忽略它:

public partial class DropDownForm : Form { 
  private needShadow = false;

  public DropDownForm(bool needShadow) {
    this.needShadow = needShadow;

    // Actually, you should have needShadow set before this call
    InitializeComponent();
  }

  protected override CreateParams CreateParams {
    get {
      CreateParams cp = base.CreateParams;

      if (needShadow)
        cp.ClassStyle |= CS_DROPSHADOW;

      return cp;
   }
 }
 ...