Используйте параметр, переданный конструктору формы в CreateParams в WinForms.NET

У меня есть пользовательская форма, определенная следующим образом:

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

Мне нужно включить тень формы в зависимости от параметра needShadow, передаваемого конструктору формы в переопределенном члене CreateParams - что-то вроде этого:

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

        if (needShadow)
            cp.ClassStyle |= CS_DROPSHADOW;

        return cp;
    }
}

Проблема в том, что я не могу получить доступ к needShadow параметр передается конструктору формы в этом CreateParams, CreateParams член выполняется перед первым оператором в моем конструкторе пользовательских форм, и я не могу кэшировать needShadow значение передается конструктору формы в поле формы, чтобы использовать его позже в CreateParams,

Чтобы решить проблему, я мог бы повернуть это needShadow параметр в статическое свойство моей формы, установите его перед созданием формы и используйте это значение в переопределенном CreateParams, Но, очевидно, это не очень хороший способ, так как мое приложение может создать несколько экземпляров этой формы, каждый со своим needShadow значение.

Есть ли аккуратное решение этой проблемы в WinForms .NET?

1 ответ

Решение

Что ж, 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;
   }
 }
 ...
Другие вопросы по тегам