我有 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
不确定我需要在这里做什么..
正如评论中所建议的,您可以使用
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