Поскольку мне нужно создать этот шаблон несколько раз в окне WPF, я создал функцию, как показано ниже.
function Group_WPF {
param (
[Windows.Controls.Canvas]$canvas,
[int]$top,
[ref]$f1,
[string]$n1,
[ref]$f2,
[string]$n2,
[ref]$isR,
[ref]$isB,
[ref]$bu,
)
$f1.Value = New-Object Windows.Controls.TextBox
$f1.Value.Width = 380
[Windows.Controls.Canvas]::SetLeft($f1.Value, 10)
[Windows.Controls.Canvas]::SetTop($f1.Value, $top + 25)
$canvas.Children.Add($f1.Value)
$f1.Value.Add_MouseDoubleClick({
param ($source, $e)
$source.SelectAll()
})
$f2.Value = New-Object Windows.Controls.TextBox
$f2.Value.Width = 380
[Windows.Controls.Canvas]::SetRight($f2.Value, 10)
[Windows.Controls.Canvas]::SetTop($f2.Value, $top + 25)
$canvas.Children.Add($f2.Value)
$f2.Value.Add_MouseDoubleClick({
param ($source, $e)
$source.SelectAll()
})
$isR.Value = New-Object Windows.Controls.CheckBox
$isR.Value.Content = "Re"
$isR.Value.IsChecked = $true
[Windows.Controls.Canvas]::SetLeft($isR.Value, 210)
[Windows.Controls.Canvas]::SetTop($isR.Value, $top + 50)
$canvas.Children.Add($isR.Value)
$isB.Value = New-Object Windows.Controls.CheckBox
$isB.Value.Content = "Bu"
[Windows.Controls.Canvas]::SetLeft($isB.Value, 290)
[Windows.Controls.Canvas]::SetTop($isB.Value, $top + 50)
$canvas.Children.Add($isB.Value)
$bu.Value = New-Object Windows.Controls.TextBox
$bu.Value.Width = 380
$bu.Value.IsReadOnly = $true
$bu.Value.Background = [System.Windows.Media.Brushes]::Gainsboro
[Windows.Controls.Canvas]::SetRight($bu.Value, 10)
[Windows.Controls.Canvas]::SetTop($bu.Value, $top + 50)
$canvas.Children.Add($bu.Value)
$bu.Value.Add_MouseDoubleClick({
param ($source, $e)
$source.SelectAll()
})
$isB.Value.Add_Checked({
$bu.Value.IsReadOnly = $false
$bu.Value.Background = [System.Windows.Media.Brushes]::White
$isR.Value.IsChecked = $false
})
$isB.Value.Add_Unchecked({
$bu.Value.IsReadOnly = $true
$bu.Value.Background = [System.Windows.Media.Brushes]::Gainsboro
})
$isR.Value.Add_Checked({
$isB.Value.IsChecked = $false
})
}
Все работает, кроме событий Add_Checked и Add_Unchecked. Когда я попробовал их, я получил следующую ошибку:
The property 'IsReadOnly' cannot be found on this object. Verify that the property exists and can be set.
At line:111 char:9
+ $bu.Value.IsReadOnly = $false
The property 'Background' cannot be found on this object. Verify that the property exists and can be set.
At line:112 char:9
+ $bu.Value.Background = [System.Windows.Media.Brushes]::White
The property 'IsChecked' cannot be found on this object. Verify that the property exists and can be set.
At line:113 char:9
+ $isR.Value.IsChecked = $false
Пожалуйста, простите меня за мою глупость. Пожалуйста, подскажите мне, как решить эту проблему. Искренне спасибо.
Параметры @MathiasR.Jessen [ref] помогают мне устанавливать множество различных имен переменных и использовать эти переменные в определенных случаях.
Использовать их потом? Просто выведите полученные элементы управления из функции :)
Поскольку вам нужны локальные переменные из контекста вызывающего объекта (т. е.: $bu
, $isR
и $isB
), вам нужно вызвать GetNewClosure:
$isB.Value.Add_Checked({
$bu.Value.IsReadOnly = $false
$bu.Value.Background = [System.Windows.Media.Brushes]::White
$isR.Value.IsChecked = $false
}.GetNewClosure())
$isB.Value.Add_Unchecked({
$bu.Value.IsReadOnly = $true
$bu.Value.Background = [System.Windows.Media.Brushes]::Gainsboro
}.GetNewClosure())
$isR.Value.Add_Checked({
$isB.Value.IsChecked = $false
}.GetNewClosure())
Я нашел это решение здесь.
Круто, получилось, спасибо за помощь.
В дополнение к предложению Orace закрыть переменные, на которые ссылаются, я бы предложил избавиться от параметров [ref]
- если вы хотите потом ссылаться на созданные элементы управления, просто выведите их из функции:
function Group_WPF {
param (
[Windows.Controls.Canvas]$canvas,
[int]$top,
[string]$n1,
[string]$n2
)
$f1 = New-Object Windows.Controls.TextBox
$f1.Width = 380
[Windows.Controls.Canvas]::SetLeft($f1, 10)
[Windows.Controls.Canvas]::SetTop($f1, $top + 25)
[void]$canvas.Children.Add($f1)
$f1.Add_MouseDoubleClick({
param ($source, $e)
$source.SelectAll()
})
$f2 = New-Object Windows.Controls.TextBox
$f2.Width = 380
[Windows.Controls.Canvas]::SetRight($f2, 10)
[Windows.Controls.Canvas]::SetTop($f2, $top + 25)
[void]$canvas.Children.Add($f2)
$f2.Add_MouseDoubleClick({
param ($source, $e)
$source.SelectAll()
})
$isR = New-Object Windows.Controls.CheckBox
$isR.Content = "Re"
$isR.IsChecked = $true
[Windows.Controls.Canvas]::SetLeft($isR, 210)
[Windows.Controls.Canvas]::SetTop($isR, $top + 50)
[void]$canvas.Children.Add($isR)
$isB = New-Object Windows.Controls.CheckBox
$isB.Content = "Bu"
[Windows.Controls.Canvas]::SetLeft($isB, 290)
[Windows.Controls.Canvas]::SetTop($isB, $top + 50)
[void]$canvas.Children.Add($isB)
$bu = New-Object Windows.Controls.TextBox
$bu.Width = 380
$bu.IsReadOnly = $true
$bu.Background = [System.Windows.Media.Brushes]::Gainsboro
[Windows.Controls.Canvas]::SetRight($bu, 10)
[Windows.Controls.Canvas]::SetTop($bu, $top + 50)
[void]$canvas.Children.Add($bu)
$bu.Add_MouseDoubleClick({
param ($source, $e)
$source.SelectAll()
})
$isB.Add_Checked({
$bu.IsReadOnly = $false
$bu.Background = [System.Windows.Media.Brushes]::White
$isR.IsChecked = $false
})
$isB.Add_Unchecked({
$bu.IsReadOnly = $true
$bu.Background = [System.Windows.Media.Brushes]::Gainsboro
})
$isR.Add_Checked({
$isB.IsChecked = $false
})
return [pscustomobject]@{
F1 = $f1
F2 = $f2
IsR = $isR
IsB = $isB
BU = $bu
}
}
Это не только упрощает чтение функции, но и облегчает ее вызов:
$myGroup = Group_WPF -top $top -n1 $n1 -n2 $n2
# now you can reference the individual controls via the properties on the output object:
if ($myGroup.IsB.IsChecked) {
$myGroup.BU.Text
}
Это так красиво, я даже не знала, что такое возможно. Вы такие добрые и внимательные, спасибо вам огромное.
Какова цель всех параметров
[ref]
?