Я пытаюсь перебрать некоторые элементы управления в приложении Powershell / WPF. Ничего особенного, просто установив некоторый текст для события mouseEnter.
Работает нормально, если я не зацикливаю код:
$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
})
}
У кого-нибудь есть мысли, почему это так, и как я могу это исправить?
Спасибо
Ben
ОК - Это еще более странно ...
Пытался решить эту проблему, используя решение, аналогичное предложению Кента. Я получил то же самое, используя $ localControl, поэтому подумал, что попробую использовать массив, чтобы убедиться, что каждая запись различна:
$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» и т. Д., Пока мой массив не будет исчерпан, когда он просто выведет ноль.
Этот порядок вывода «Один», «Два», «Три», «Четыре» одинаков независимо от порядка наведения на элементы управления.
... Подожди минутку. Поместите $ 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
}
Устанавливает все выходы на ноль.