1

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

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;
    }
}

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

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

WinForms .NET 中是否有针对此问题的巧妙解决方案?

4

1 回答 1

3

嗯,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;
   }
 }
 ...
于 2018-08-16T12:36:57.187 回答