PowerShell: дублирование оконных форм с различными свойствами - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь сделать копии оконных форм объектов и изменить свойства новых объектов. Например:

$List1 = New-Object System.Windows.Forms.ListBox
$List1.Location = New-Object System.Drawing.Size(10,10)
$List1.Size = New-Object System.Drawing.Size(280,310)

$List2 = $List1
$List2.Location = New-Object System.Drawing.Size(350,10)

Проблема в том, что $List2 - это указатель $List1. Что бы я ни изменил на $List2, всегда меняйте свойства на $List1. Есть ли решение для этого?

$List1.Location

IsEmpty   X  Y
-------   -  -
  False 350 10



$List1.Location

IsEmpty   X  Y
-------   -  -
  False 350 10

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

$List1 и $List2 ссылаются на тот же объект , потому что вы сделали $List1 = $List2.

Вы должны создать 2 отдельных экземпляра. Вы можете установить все общие свойства в цикле, а затем изменить только те свойства, которые отличаются:

# 1. create two separate instances
$list1 = New-Object System.Windows.Forms.ListBox
$list2 = New-Object System.Windows.Forms.ListBox

# 2. set properties on both instances
foreach ($list in ($list1, $list2)) {
    $list.Location = New-Object System.Drawing.Size(10, 10)
    $list.Size = New-Object System.Drawing.Size(280, 310)
    # [...]
}

# 3. set all different properties on the 2nd instance only
$list2.Location = New-Object System.Drawing.Size(350, 10)
# [...]
0 голосов
/ 08 ноября 2018

Что бы я ни изменил в $ List2, всегда меняйте свойства в $ List1. Есть ли решение для этого?

Да, решение состоит в том, чтобы создать новый экземпляр ListBox:

$List1 = New-Object System.Windows.Forms.ListBox
$List1.Location = New-Object System.Drawing.Size(10,10)
$List1.Size = New-Object System.Drawing.Size(280,310)

$List2 = New-Object System.Windows.Forms.ListBox
$List2.Size = $List1.Size
$List2.Location = New-Object System.Drawing.Size(350,10)

Обратите внимание, что $List2.Size = $List1.Size безопасно, потому что Size является структурой, а структуры копируются при присваивании


Если у вас есть много свойств для ссылки, вы можете заключить значения общих свойств в хеш-таблицу для передачи в New-Object -Property:

$ListBoxDefaultProperties = @{
    Location = New-Object System.Drawing.Size (10,10)
    Size = New-Object System.Drawing.Size (280,310)
    BackColor = 'Beige'
    DisplayMember = 'SomePropertyName'
    # etc...
}
$List1 = New-Object System.Windows.Forms.ListBox -Property $ListBoxDefaultProperties
$List2 = New-Object System.Windows.Forms.ListBox -Property $ListBoxDefaultProperties
$List3 = New-Object System.Windows.Forms.ListBox -Property $ListBoxDefaultProperties
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...