如何访问方法内powershell脚本块内的类实例

问题描述 投票:0回答:1

所以我正在使用此代码使用 powershell 编写一个 WPF 窗口

Add-Type -AssemblyName PresentationFramework
class Window 
{
    [System.Windows.Window]$window
    [System.Windows.Controls.Button]$button
    [int]$count = 0

    Window()
    {
        [xml]$xaml = @"
        <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            x:Name="Window"
            Title="C#Shell!">
            <Grid x:Name="Grid">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="100"/>
                </Grid.RowDefinitions>
                
                <ListView x:Name="List" />
                <Button x:Name="AddButton" Content="Add" Grid.Row="1"/>
            </Grid>
        </Window>
"@
        $reader = [System.Xml.XmlNodeReader]::new($xaml)
        $this.window = [System.Windows.Markup.XamlReader]::Load($reader)
        $this.button = $this.window.FindName("AddButton")
        $this.button.Add_Click({
            # How do I access this.window??
            $this.window.FindName("List").Items.Add("Item" + ($this.count++).ToString())
        })
        $this.window.ShowDialog()
    }
}

$window = [Window]::new()

如何访问

this.window
脚本块内的
Add_Click
?当前代码给了我

Exception calling "ShowDialog" with "0" argument(s): "You cannot call a method on a null-valued expression."
At line:33 char:9

我可以看出这不是因为

ShowDialog()
。该行应该已经执行了,否则不会有窗口。

powershell
1个回答
0
投票

在 GUI 应用程序中使用 PowerShell 类并不是一个好主意,在

System.Windows.Window
事件的上下文中,
$this
是代表 sender 的自动变量,
$_
是代表 事件参数的自动变量。因此,您会丢失对包含它的实例的引用。

$this.button.Add_Click({
    param($s, $e)

    # `$s` the sender, is the same as `$this`
    $s -eq $this | Out-Host
    # `$e` the event args, is the same as `$_`
    $e -eq $_ | Out-Host
})

例如,您可以使用

$this.Parent.Parent
来获取父
System.Windows.Window
对象,但除了使用分配该实例的变量名称之外,可能没有其他方法可以引用回您的类型的实例,更糟糕的是,您'您需要使用
$script:
瞄准镜。

$this.button.Add_Click({
    $window = $script:window
    $window.window.FindName('List').Items.Add('Item' + ($window.count++).ToString())
})
© www.soinside.com 2019 - 2024. All rights reserved.