Jump to content

Zugriff auf dynamisch erzeugte Steuerelemente in WPF mit PowerShell


Direkt zur Lösung Gelöst von ineedhelp,

Empfohlene Beiträge

Nachdem auf eine Schalftfläche geklickt wurde, werden Steuerelemte in einer grafischen WPF-Oberfläche dynamisch erzeugt und zu einem in Xaml-Code definierten Stackpanel hinzugefügt. Unter den dynamisch erzeugten Steuerelementen befindet sich auch eine Schaltfläche. In dem Click-Ereignishandler soll auf eine zur Laufzeit erzeugte Textbox zu gegriffen werden. Das Textbox-Objekt wird einer Variable zu gewiesen. Trotz das die Variable im selben Gültigkeitsbereich erzeugt wurde, wird die Variable im Ereignishandler nicht gefunden. Die FrameworkElement.FindName(String)-Methode liefert auch nur $null zurück. Über die Children-Auflistung des Stackpanels kann aber zur Textbox navigiert werden. Das ist aber bei sehr verschachteles Xaml umständlich, unübersichtlich und fehleranfällig.

 

Gibt eine Möglichkeit die Variable dem Click-Ereignishandler als Parameter zu übergeben?

 

Vielen Dank im Voraus.

 

 

$xaml = @'
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="500" Width="800"
    WindowStartupLocation="CenterScreen"
    >
    <Grid Background="LightGreen">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <StackPanel VerticalAlignment="Center">
        <Button x:Name="ComputerButton" Content="Rechner" Margin="20" />
        <Button x:Name="UserButton" Content="Benutzer" Margin="20" />
    </StackPanel>
    <StackPanel Grid.Column="1" Background="White" Margin="0,20,20,20">
        <StackPanel x:Name="Content" HorizontalAlignment="Left" />
    </StackPanel>
    </Grid>
</Window>
'@

$reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]$xaml)
$window = [System.Windows.Markup.XamlReader]::Load($reader)

$contentPanel = $window.FindName('Content')

$window.FindName('ComputerButton').Add_Click({
    $contentPanel.Children.Clear()

    $label            = New-Object System.Windows.Controls.Label
    $label.Content    = 'Rechnername:'
    $label.FontWeight = 'ExtraBold'

    $textBox          = New-Object System.Windows.Controls.TextBox
    $textbox.Margin   = '20,0,20,0'
    $textBox.Name     = 'ComputerNameTextBox'
    $textBox.Width    = '250'

    $button           = New-Object System.Windows.Controls.Button
    $button.Content   = 'Suchen'
    $button.IsDefault = $true
    $button.Width     = '100'
    $button.Add_Click({
        # $computer = $textBox.Text
        Write-Host ($null -eq $textBox) # Ausgabe: True
        
        # $computer = $window.FindName('ComputerNameTextBox').Text
        Write-Host ($null -eq $window.FindName('ComputerNameTextBox')) # Ausgabe: True

        $computer = $contentPanel.Children[1].Children[0].Text

        if (-not([String]::IsNullOrEmpty($computer)) ) {
            [System.Windows.Forms.MessageBox]::Show($computer)
        }
    })

    $stackPanel             = New-Object System.Windows.Controls.StackPanel
    $stackPanel.Orientation = 'Horizontal'
    $stackPanel.Children.Add($textBox)
    $stackPanel.Children.Add($button)

    $contentPanel.Children.Add($label)
    $contentPanel.Children.Add($stackPanel)
})

$window.FindName('UserButton').Add_Click({
    $contentPanel.Children.Clear()

    $label            = New-Object System.Windows.Controls.Label
    $label.Content    = 'NICHT IMPLEMENTIERT'
    $label.FontWeight = 'ExtraBold'
    $label.Foreground = 'Red' 

    $contentPanel.Children.Add($label)
})

[void]$window.ShowDialog()

 

Link zu diesem Kommentar

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...