Событие Powershell Add_Checked, Add_Unchecked не происходит в пользовательской функции

Поскольку мне нужно создать этот шаблон несколько раз в окне 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

Пожалуйста, простите меня за мою глупость. Пожалуйста, подскажите мне, как решить эту проблему. Искренне спасибо.

Какова цель всех параметров [ref]?

Mathias R. Jessen 19.06.2024 00:44

Параметры @MathiasR.Jessen [ref] помогают мне устанавливать множество различных имен переменных и использовать эти переменные в определенных случаях.

NqHai 19.06.2024 03:56

Использовать их потом? Просто выведите полученные элементы управления из функции :)

Mathias R. Jessen 19.06.2024 10:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку вам нужны локальные переменные из контекста вызывающего объекта (т. е.: $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())

Я нашел это решение здесь.

Круто, получилось, спасибо за помощь.

NqHai 19.06.2024 03:53

В дополнение к предложению 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
}

Это так красиво, я даже не знала, что такое возможно. Вы такие добрые и внимательные, спасибо вам огромное.

NqHai 19.06.2024 15:21

Другие вопросы по теме