Powershell v5 - 引用 WPF 对象时的变量名称替换

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

我有 5 个按钮,它们将触发文件选择对话框,以使用所选文件路径填充 5 个文本字段。每个文件选择一个按钮即可填充单个 WPF 表单文本字段。 我不想使用 switch 语句为每个按钮重复 6 行代码。我想简化它。
我可以获取发送者按钮名称,但我不能做的是使用通过开关选项设置的变量来设置文本字段。有什么想法吗?

# General buttons file selection handler
 $WPFselectmergefile1.AddHandler([System.Windows.Controls.Button]::ClickEvent, $selectmergefile)
$WPFselectmergefile2.AddHandler([System.Windows.Controls.Button]::ClickEvent, $selectmergefile)

...

# handler function - as is - so this one works with lines per option.
[System.Windows.RoutedEventHandler]$Script:SelectMergeFile = {
param($sender, $e)
switch($sender.name) {
'selectmergefile1'  {
    FileDetails 'mergefile1' $WPFmergefile1.Text 2 # prep store 
    $x = File $Global:SourceFolder
    $WPFmergefile1.Text = $x
    $Global:SelectedMergeFile1 = $x
    FileDetails 'mergefile1' $WPFmergefile1.Text 2 # update store
 }
 'selectmergefile2' {
    FileDetails 'mergefile2' $WPFmergefile2.Text 2 
    $x = File $Global:SourceFolder
    $WPFmergefile2.Text = $x
    $Global:SelectedMergeFile2 = $x 
    FileDetails 'mergefile2' $WPFmergefile2.Text 2
 }
...

# What I want to do:
[System.Windows.RoutedEventHandler]$Script:SelectMergeFile = {
    param($sender, $e)
    $opt = $sender.Substring($sender.length-1)
    FileDetails "mergefile$opt" $WPFmergefile$opt.Text 2 
    $x = File $Global:SourceFolder
    $WPFmergefile$opt.Text = $x
    $Global:SelectedMergeFile$opt = $x  
    FileDetails "mergefile$opt" $WPFmergefile$opt.Text 2
}

我尝试过变量替换:

"mergefile$opt"        # which works

$WPFmergefile$opt.Text    # which doesnt
$WPFmergefile$($opt).Text # which doesnt
$Global:SelectedMergeFile$opt = .. # which doesnt

不确定我需要在这里做什么..

powershell variables wpf-controls
1个回答
1
投票

正如评论中所建议的,您可以使用

Get-Variable -ValueOnly
按名称检索变量的值:

(Get-Variable "mergefile$opt" -ValueOnly).Text

话虽如此,您可能需要考虑在哈希表或其他字典类型中组织控件。

假设您有类似以下内容的内容来自动将 XAML 控件分配给变量:

$xaml.SelectNodes("//*[@Name]") | ForEach-Object {
    Set-Variable -Name "WPF$($_.Name)" -Value $Window.FindName($_.Name)
}

将其替换为:

# create hashtable to hold the control references
$WPFControls = @{}

$xaml.SelectNodes("//*[@Name]") | ForEach-Object {
    $WPFControls[$_.Name] = $Window.FindName($_.Name)
}

现在您可以轻松地按名称引用控件:

$WPFControls["mergefile$opt"].Text = $x
© www.soinside.com 2019 - 2024. All rights reserved.