Jump to content

Zugriff auf dynamisch erzeugte Steuerelemente in WPF mit PowerShell


Direkt zur Lösung Gelöst von ineedhelp,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

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()

 

  • Beste Lösung
Geschrieben
vor 21 Stunden schrieb ineedhelp:

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

Ja. Möglichkeit gefunden. Funktion mit Parameter definieren und diese Funktion im Click-Ereignishandler mit Parameter aufrufen.

  • Like 1
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...