ineedhelp 12 Geschrieben 22. November 2023 Melden Teilen Geschrieben 22. November 2023 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() Zitieren Link zu diesem Kommentar
Beste Lösung ineedhelp 12 Geschrieben 23. November 2023 Autor Beste Lösung Melden Teilen Geschrieben 23. November 2023 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. 1 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.