wpf - 了解 Powershell 全局变量的用例
问题描述
最近,我一直在从事一个项目,我尝试为我的 Powershell 脚本创建 GUI。尽管似乎存在很多可能性,但我找到了一种由 Microsoft PFE 设计的方法:Chris Conte。
如果你们有兴趣,可以在这里找到这篇文章。
现在,我的问题特别与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
}
由于$xamGUI
XAML 读取器捕获的新创建的变量在脚本之间共享,因此我可以理解它们的全局范围。我的问题是针对这一行的:
[xml]$Global:xmlWPF = Get-Content -Path $XamlPath
他为什么使用全局范围?这是为了以防我们想在其他地方使用它或者我缺少什么?我对 Powershell 环境还很陌生,该片段的作者显然在 Powershell 世界中臭名昭著,所以我猜这个声明是有原因的,但我不知道这是什么。
解决方案
辅助脚本本质上是“返回”事物——XML、表单和所有控件——作为变量给用户。例如,如果button1
在 XAML 中标记了一个按钮,则脚本将创建一个全局变量$global:button1
。然后,您可以使用此变量附加事件处理程序:
$button1.add_Click{ $Label1.Content = "Hello World" }
在事件处理程序中,对这些全局变量的需求变得显而易见。您必须以某种方式将表单控件传递给事件处理程序脚本块 - 在这种情况下,Label1
. 最简单的方法是在父(例如全局)范围内创建变量并允许动态范围为您完成工作。C# 通过使所有控件成员成为封闭类的成员来使用类似(但词法范围)的方法。
推荐阅读
- google-api - gapi.client.drive.files.create 不起作用
- javascript - javascript chart not displaying
- python - 如何通过真实图片帖子分享到 Facebook?
- average - 50 次 Netlogo Simulation_Agent Based Simulation 的平均结果
- flask - 单元测试 Flask-Admin 模块?
- gcc - 如何从 gcc 隐藏单个头文件
- python - Pandas df.style.bar 同时保持舍入
- angular - 为什么动态创建的(SVG)矩形组件只出现在 DOM 中而不出现在视图中?
- php - Cakephp 从 3.6.16 升级到 4.2 rector 命令不起作用 bin/cake upgrade rector --rules phpunit80 C:\Apache24\htdocs\Techno\tests
- javascript - 访问函数外的 JSON response.status (Axios)