Как создать список ссылок Dynami c с PowerShell и WPF? - PullRequest
2 голосов
/ 26 апреля 2020

У меня есть массив переменной длины с несколькими именами сайтов и соответствующими ссылками. Я покажу их в Windows формах на основе GUI.

. Массив будет считан из файла XML, но выглядит он так

$linklist = @(
("Site 1" , "https://link1.com"),
("Site 2" , "https://link2.com")
)

Тогда я у меня есть Windows окно форм с именем "mainform" и создайте там каждый элемент:

$Link1 = New-Object System.Windows.Forms.LinkLabel
$Link1.Text = $sitename
$Link1.Location = New-Object System.Drawing.Point(40,$calculatedPosition)
$Link1.add_Click({ start $sitelink })
$mainform.Controls.Add($Link1)

Это можно сделать вручную для каждого элемента в моем массиве - пока, так просто, как журнал, у меня есть фиксированное количество элементов в моем массиве.

Но мне нравится делать это динамически, обрабатывать массивы с настроенным содержимым.

Я пытался использовать динамические c переменные, потому что каждому LinkLabel нужно свое имя переменной. Я знаю, что имена переменных Dynami c могут создаваться командлетом New-Variable, но я понятия не имею, как управлять этой новой переменной для создания LinkLabel.

Заранее благодарю за все ваши полезные идеи ...

1 Ответ

0 голосов
/ 26 апреля 2020

Я бы сначала создал упорядоченный Hashtable из ваших $linklist массивов массивов, чтобы упростить задачу:

$linklist = @(
("Site 1" , "https://link1.com"),
("Site 2" , "https://link2.com")
)

# convert the array of arrays into an ordered Hashtable
$linkHash = [ordered]@{}
$linklist | ForEach-Object { $linkHash[$_[0]] = $_[1] }

Используя эту хеш-таблицу, динамическое создание ссылочных меток не очень сложно сделать:

$linkHash.GetEnumerator() | ForEach-Object {
    $lnk = New-Object System.Windows.Forms.LinkLabel
    $lnk.Text = $_.Name   # set the name for the label
    $lnk.Tag  = $_.Value  # store the link url inside the control's Tag property
    $lnk.Location = New-Object System.Drawing.Point(40, $calculatedPosition)
    # inside the scriptblock, $this refers to the LinkLabel control itself
    $lnk.Add_Click({ Start-Process $this.Tag })  
    $mainform.Controls.Add($lnk)
    $calculatedPosition += 15   # just a guess, you may want different vertical spacing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...