derhoeppi
Goto Top

PowerShell TabControl steuern

Hallo,
ich habe für ein Powershell Skript eine GUI erzeugt, die ich als XAML Datei im Skript lade. Danach initialisiere ich die Steuerelemente und füge Form-Action-Events hinzu. In meiner GUI habe ich ein TabControl-Steuerelement mit 3 Tabs.
Diese habe ich nach dem Muster:

$tabControl = $Form.FindName ('Name_des_Tabcontrol')

initialisiert. Danach folgt dasselbe für die einzelnen Tabs. Mein Ziel ist es nun, dass ich gerne über Powershell herausfinden möchte, welches Tab aktiv ist. Bisher habe ich es mit einem Vergleich $tabControl.SelectedTab.Name = "tabName" versucht. Ich es auch ohne der Property Name und mit der Property Text versucht. Powershell moniert das er die Properties nicht kennt. Kann mir jemand bei dem Problem helfen?

Gruß
derhoeppi

Content-Key: 266936

Url: https://administrator.de/contentid/266936

Printed on: April 19, 2024 at 20:04 o'clock

Member: colinardo
Solution colinardo Mar 20, 2015 updated at 10:36:20 (UTC)
Goto Top
Hallo derhoeppi,
hier ein Beispiel:
[xml]$xaml = @"  
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    x:Name="Window" Title="Initial Window" WindowStartupLocation = "CenterScreen"   
    Width = "525" Height = "190" ShowInTaskbar = "True">  
    <StackPanel>
	<TabControl x:Name="myTabControl"   
                    HorizontalAlignment="Left"  
		    Height="100"  
		    Margin="10,10,0,0"  
		    VerticalAlignment="Top"  
		    Width="497">  
	    <TabItem Header="Cat">  
		<Grid Background="#FFE5E5E5">  
		    <TextBlock HorizontalAlignment="Left"  
			       Margin="10"  
			       TextWrapping="Wrap"  
			       Text="Take pictures of me and put them on the Internet. Meow."  
			       VerticalAlignment="Top"  
			       Width="471"/>  
		</Grid>
	    </TabItem>
	    <TabItem Header="Mouse">  
		<Grid Background="#FFE5E5E5">  
		    <TextBlock HorizontalAlignment="Left"  
			       Margin="10"  
			       TextWrapping="Wrap"  
			       Text="I want some cheese."  
			       VerticalAlignment="Top"  
			       Width="471"/>  
		</Grid>
	    </TabItem>
	</TabControl>
    <TextBox x:Name="myTextbox" Text="" Width="300" />  
    </StackPanel>
</Window>
"@   

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load( $reader )
$tab = $window.FindName("myTabControl")  
$textbox = $window.FindName("myTextbox")  
$tab.Add_SelectionChanged({
    $textbox.Text = $tab.SelectedItem.Header
})
$window.ShowDialog() | out-null
Grüße Uwe
Member: derhoeppi
derhoeppi Mar 20, 2015 at 10:40:00 (UTC)
Goto Top
Hallo Uwe,

wieder einmal vielen Dank für deine Hilfe. Ich habe es ja bis dato mit SelectedItem.Name versucht. Statt Name ist es Header. Nachdem ich das nun herausgefunden habe, könnte ich versinken. In der XAML Datei steht es ja ganz deutlich.

Gruß
derhoeppi
Member: colinardo
colinardo Mar 20, 2015 updated at 10:46:58 (UTC)
Goto Top
Ja, da kann ich mich auch noch dran erinnern, da bin ich ganz am Anfang auch drüber gestolpert.
Muss man sich erst dran gewöhnen wenn man von Windows-Forms umsteigt face-smile

Grüße Uwe
Member: derhoeppi
derhoeppi Mar 23, 2015 at 06:03:43 (UTC)
Goto Top
Guten Morgen Uwe,

in meinem Skript habe ich nun ein Verhalten das ich so nicht erwartet hätte. Die Header-Informationen des TabItems lese ich aus, damit ich das aktive TabItem erhalte. Ein Button führt die Funktion aus und startet je nach TabItem unterschiedliche Aktionen. Das funktioniert soweit. Zusätzlich habe ich für das TabControl einen EventHandler, der sich SelectionChanged nennt. Dabei bin ich davon ausgegangen, dass sich dieses Event auf das TabControl bezieht, so dass eine Aktion ausgelöst wird, wenn ich von einem zum anderen TabItem wechsel. In meinem Fall sollen bei einem Wechsel des TabItems Variablen / Objekte zurückgesetzt werden. Auch das funktioniert soweit, aber der EventHandler beschränkt sich nicht nur auf das TabControl, sondern auch auf Elemente innerhalb der TabItems. So lasse ich z.B. in einem TabItem eine Combobox mit Werten füllen. Wähle ich derzeit einen Wert aus, wird das gesamte TabItem zurückgesetzt, so dass meine Combobox wieder leer ist.

Kennst du eine Möglichkeit, wie ich das Verhalten durchbrechen kann und trotzdem auf keine gewollte Funktion verzichten muss?

Gruß
derhoeppi
Member: colinardo
Solution colinardo Mar 23, 2015, updated at Mar 24, 2015 at 06:35:51 (UTC)
Goto Top
Moin,
das kannst du folgendermaßen machen:
$tab.Add_SelectionChanged({
    if($_.Source.getType() -eq [System.Windows.Controls.TabControl]){
        $textbox.Text = $tab.SelectedItem.Header
    }
})
Du überprüfst hiermit den Typ des Controls welches das Event ausgelöst hat. Der Grund warum alle Controls innerhalb eines Tabs das Event auslösen ist das Event-Bubbling, das nach oben wandert und auch das SelectionChanged Event des Tab-Controls auslösen. Mit der Überprüfung des Control-Typs kannst du das verhindern.

Grüße Uwe