Как Родитель работает в System.Windows.Forms - PullRequest
1 голос
/ 11 декабря 2019

У меня есть следующий код, который ( почти ) работает должным образом:

Add-Type -AssemblyName System.Windows.Forms

class MyForm : System.Windows.Forms.Form {
    MyForm($mystuff) {
        #Do-Stuff
        $this.Add_Load( $this.MyForm_Load )
    }

    $MyForm_Load = {
        $mlabel = [System.Windows.Forms.Label]::new()
            $mlabel.Name = "label"
            $mlabel.Text = "disabled"

        $mbutton = [System.Windows.Forms.Button]::new()
            $mbutton.Name = "button"
            $mbutton.Location = [System.Drawing.Point]::new(100,100)
            $mbutton.Add_Click( $this.mbutton_click )

        $this.Controls.Add($mlabel)
        $this.Controls.Add($mbutton)

    # ----------------------------------------------
    # Now $this.controls has something. We can now access it.
    # ----------------------------------------------
        if ($this.controls["label"].text -eq "enabled"){
            $mbutton.text = "disable"
        }else{
            $mbutton.text = "enable"
        }
    }

    $mbutton_click = {
        if ($this.Parent.Controls["label"].Text -eq "enabled"){
            $this.Parent.Controls["label"].Text = "disabled"
            $this.Parent.Controls["button"].Text = "enable"
        }
        else{
            $this.Parent.Controls["label"].Text = "enabled"
            $this.Parent.Controls["button"].Text = "disable"
        }
    }
}

$foo = [MyForm]::new("test")
$foo.ShowDialog()

, но когда я заменяю следующий раздел:

$mbutton_click = {
    if ($this.Parent.Controls["label"].Text -eq "enabled"){
        $this.Parent.Controls["label"].Text = "disabled"
        $this.Parent.Controls["button"].Text = "enable"
    }
    else{
        $this.Parent.Controls["label"].Text = "enabled"
        $this.Parent.Controls["button"].Text = "disable"
    }
}

Для этого (отсутствует Parent):

$mbutton_click = {
    if ($this.Controls["label"].Text -eq "enabled"){
        $this.Controls["label"].Text = "disabled"
        $this.Controls["button"].Text = "enable"
    }
    else{
        $this.Controls["label"].Text = "enabled"
        $this.Controls["button"].Text = "disable"
    }
}

Тогда мой скрипт перестает работать, и на консоли появляется следующая ошибка:

The property 'Text' cannot be found on this object. Verify that the property exists and can be set.

Почему $MyForm_Load работает без Parent, но $mbutton_clickтребует Parent? Разве оба $MyForm_Load и $mbutton_click не являются частью одного и того же объекта? Как Parent работает в System.Windows.Forms?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...