所以我正在使用此代码使用 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()
。该行应该已经执行了,否则不会有窗口。
在 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())
})