我想通过Powershell/WPF应用程序中的某些控件循环。没有什么奇特的,只是在mouseEnter事件上设置一些文本。循环浏览WPF/Powershell中的控件
,如果我不循环的代码工作正常:
$reader = New-Object System.Xml.XmlNodeReader $xaml
$d = [Windows.Markup.XamlReader]::Load($reader)
$d.FindName("GridOne").add_mouseEnter({
$d.FindName("HelpText").Content = "One"
})
$d.FindName("GridTwo").add_mouseEnter({
$d.FindName("HelpText").Content = "Two"
})
$d.FindName("GridThree").add_mouseEnter({
$d.FindName("HelpText").Content = "Three"
})
$d.FindName("GridFour").add_mouseEnter({
$d.FindName("HelpText").Content = "Four"
})
但如果我尝试同样的事情作为循环它设置的MouseEnter事件设置文本为“四”的所有控件,阵列的最后一个元素:
$reader = New-Object System.Xml.XmlNodeReader $xaml
$d = [Windows.Markup.XamlReader]::Load($reader)
$arrControls = ("One","Two","Three","Four")
foreach ($control in $arrControls) {
$d.FindName("Grid$control").add_mouseEnter({
$d.FindName("HelpText").Content = $control
})
}
任何人有任何想法,为什么这是,我怎么能解决它?
感谢,
本
OK - 这是更加古怪......
尝试使用沿着肯特的建议通过一项解决方案来解决这个问题。我得到了使用$本地控制一样,所以想我会尝试使用阵列,以确保每一个条目是不同的:
$i = 0
$localControl = @()
foreach ($control in $arrControls) {
$localControl += $control
write-host "$d.FindName('Grid$control').add_mouseEnter({ $d.FindName('HelpText').Content = $control })"
$d.FindName("Grid$control").add_mouseEnter({
$d.FindName("HelpText").Content = $localControl[$i]
$i = $i + 1
})
}
我知道拿到的行为是每个我将鼠标悬停在控制时间,文本只是通过增加阵列一步。例如,悬停的第一个控件将输出“One”,下一个将输出“Two”,依此类推,直到我的数组耗尽时,它只输出null。
无论将鼠标悬停在控件上的顺序如何,此“一个”,“两个”,“三个”,“四个”输出顺序都是相同的。
...等一下。已将$ i = $ i + 1放入MouseEnter!
修改为:
$i = 0
$localControl = @()
foreach ($control in $arrControls) {
$localControl += $control
write-host "$d.FindName('Grid$control').add_mouseEnter({ $d.FindName('HelpText').Content = $control })"
$d.FindName("Grid$control").add_mouseEnter({
$d.FindName("HelpText").Content = $localControl[$i]
})
$i = $i + 1
}
所有输出设置为null。
这太棒了 - 让我难住了!感谢Stej。 – Ben 2010-08-06 11:10:48
欢迎:)只是好奇......你为什么不使用PowerBoots/WPK等一些dsl? – stej 2010-08-06 11:38:28