最近,我一直致力于一个项目,我尝试为我的Powershell脚本创建GUI。虽然,似乎存在很多可能性,但我发现了一种由Microsoft PFE设计的方法: Chris Conte 。
如果你们有兴趣,你可以找到文章here。
现在,我的问题特别与loadDialog.ps1
脚本有关,它基本上是XAML表单和原始Powershell脚本之间的链接。这是代码:
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=1)]
[string]$XamlPath
)
[xml]$Global:xmlWPF = Get-Content -Path $XamlPath
#Add WPF and Windows Forms assemblies
try{
Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,system.windows.forms
} catch {
Throw "Failed to load Windows Presentation Framework assemblies."
}
#Create the XAML reader using a new XML node reader
$Global:xamGUI = [Windows.Markup.XamlReader]::Load((new-object System.Xml.XmlNodeReader $xmlWPF))
#Create hooks to each named object in the XAML
$xmlWPF.SelectNodes("//*[@Name]") | %{
Set-Variable -Name ($_.Name) -Value $xamGUI.FindName($_.Name) -Scope Global
}
由于XAML阅读器捕获的$xamGUI
和新创建的变量在脚本之间共享,我可以理解它们的全局范围。我的问题专门针对这一行:
[xml]$Global:xmlWPF = Get-Content -Path $XamlPath
为什么他使用全球范围?这是为了以防我们想在其他地方使用它还是有些东西我不见了?我仍然是Powershell环境的新手,而且片段的作者显然在Powershell世界中声名狼借,所以我猜这个声明是有原因的,但是我不知道这是什么。
答案 0 :(得分:0)
帮助程序脚本基本上是"返回"事物 - XML,表单和所有控件 - 作为变量的用户。例如,如果XAML中有一个标记为button1
的按钮,则该脚本将创建一个全局变量$global:button1
。然后,您可以使用此变量附加事件处理程序:
$button1.add_Click{ $Label1.Content = "Hello World" }
它在事件处理程序中对这些全局变量的需求变得明显。您必须以某种方式将表单控件传递给事件处理程序scriptblock - 在本例中为Label1
。最简单的方法是在父(例如全局)范围内创建变量,并允许动态范围为您完成工作。 C#通过创建封闭类的所有控件成员来使用类似(但是词法范围)的方法。