Menü-Überschrift in einer GUI durch PowerShell
Moin zusammen,
mit PowerShell bin ich leider noch nicht so lange beschäftigt, da aufgrund von vielen Altlasten noch alles über Batch laufen musste. Nun kann ich die alten Skripte mit PowerShell erneuern und möchte das auch mit vernünftigen Aussehen machen.
Zu meinem Problem:
Der Benutzer muss an verschiedenen Stellen etwas Auswählen und ich wollte dies mit einer einfachen Klickoberfläche lösen; das klappt auch soweit bis auf die Formatierung der Überschrift. Diese ist unterschiedlich lang und mein Wunsch wäre es, wenn diese sich, wenn sie denn länger ist, nicht nach rechts ausbreitet sondern durch einen Zeilenumbruch nach unten erweitert und dabei die Schaltflächen nach unten schiebt.
Alle meine Versuche sind nicht erfolgreich...
Besten Dank schonmal
Gruß
Itchley
mit PowerShell bin ich leider noch nicht so lange beschäftigt, da aufgrund von vielen Altlasten noch alles über Batch laufen musste. Nun kann ich die alten Skripte mit PowerShell erneuern und möchte das auch mit vernünftigen Aussehen machen.
Zu meinem Problem:
Der Benutzer muss an verschiedenen Stellen etwas Auswählen und ich wollte dies mit einer einfachen Klickoberfläche lösen; das klappt auch soweit bis auf die Formatierung der Überschrift. Diese ist unterschiedlich lang und mein Wunsch wäre es, wenn diese sich, wenn sie denn länger ist, nicht nach rechts ausbreitet sondern durch einen Zeilenumbruch nach unten erweitert und dabei die Schaltflächen nach unten schiebt.
Alle meine Versuche sind nicht erfolgreich...
# Create a listbox to select the region
[System.Windows.Forms.Application]::EnableVisualStyles()
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
# Menu Layout
$MenuBox = New-Object System.Windows.Forms.Form
#$MenuBox.Size = New-Object System.Drawing.Size @(650,250)
$MenuBox.Text = 'Miau'
$MenuBox.StartPosition = "CenterScreen"
$MenuBox.AutoSize = $True
$MenuBox.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D
# Menu Header Text
$MenuHeader = New-Object System.Windows.Forms.Label
$MenuHeader.Font = New-Object System.Drawing.Font("Consolas",20,3,3,1)
$MenuHeader.Location = New-Object System.Drawing.Size(118,20)
#$MenuHeader.Size = New-Object System.Drawing.Size(380,40)
$MenuHeader.AutoSize = $True
$MenuHeader.Text = 'Eine nun etwas längere Überschrift'
$MenuHeader.TextAlign = [System.Drawing.ContentAlignment]::TopCenter
$MenuBox.Controls.Add($MenuHeader)
# Button Level 0
$Button0 = New-Object System.Windows.Forms.Button
$Button0.Location = New-Object System.Drawing.Size(62,60)
$Button0.Size = New-Object System.Drawing.Size(500,30)
$Button0.Add_Click({
$global:ButtonResult = 'Ergebnis0'
$MenuBox.Close()
})
$Button0.Text = 'Text für Schaltfläche 0'
$Button0.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,0,3,1)
$MenuBox.Controls.Add($Button0)
# Button Level 1
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Size(62,100)
$Button1.Size = New-Object System.Drawing.Size(500,30)
$Button1.Add_Click({
$global:ButtonResult = 'Ergebnis1'
$MenuBox.Close()
})
$Button1.Text = 'Text für Schaltfläche 1'
$Button1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,0,3,1)
$MenuBox.Controls.Add($Button1)
# Button Level 2
$Button2 = New-Object System.Windows.Forms.Button
$Button2.Location = New-Object System.Drawing.Size(62,140)
$Button2.Size = New-Object System.Drawing.Size(500,30)
$Button2.Add_Click({
$global:ButtonResult = 'Ergebnis2'
$MenuBox.Close()
})
$Button2.Text = 'Text für Schaltfläche 2'
$Button2.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,0,3,1)
$MenuBox.Controls.Add($Button2)
# Button Level 3
$Button3 = New-Object System.Windows.Forms.Button
$Button3.Location = New-Object System.Drawing.Size(62,180)
$Button3.Size = New-Object System.Drawing.Size(500,30)
$Button3.Add_Click({
$global:ButtonResult = 'Ergebnis3'
$MenuBox.Close()
})
$Button3.Text = 'Text für Schaltfläche 3'
#$Button3.Text.MouseOverColor = [System.Drawing.Color]::red
#$Button3.TextAlign = [System.Drawing.ContentAlignment]::TopCenter
$Button3.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,0,3,1)
$MenuBox.Controls.Add($Button3)
# Exit Button
$ExitButton = New-Object System.Windows.Forms.Button
$ExitButton.Location = New-Object System.Drawing.Size(540,220)
$ExitButton.Size = New-Object System.Drawing.Size(75,23)
$ExitButton.Text = "Exit"
$ExitButton.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",11,0,3,1)
$ExitButton.Add_Click({
#Remove-Item "$WorkingDirectory\Temp\*.*" -Force
$MenuBox.Close()
})
$MenuBox.Controls.Add($ExitButton)
# Show Menu
$MenuBox.Topmost = $True
$MenuBox.Add_Shown({$MenuBox.Activate()})
[void] $MenuBox.ShowDialog()
$global:ButtonResult
Besten Dank schonmal
Gruß
Itchley
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7513461852
Url: https://administrator.de/forum/menue-ueberschrift-in-einer-gui-durch-powershell-7513461852.html
Ausgedruckt am: 05.04.2025 um 19:04 Uhr
6 Kommentare
Neuester Kommentar

Kannst du bspw. mit einem FlowLayoutPanel machen
https://www.philosophicalgeek.com/2008/12/12/an-easy-stack-layout-panel- ...
Und der Eigenschaft WordWrap auf $true festlegen
https://learn.microsoft.com/de-de/dotnet/api/system.windows.forms.textbo ...
Zeppel
https://www.philosophicalgeek.com/2008/12/12/an-easy-stack-layout-panel- ...
Und der Eigenschaft WordWrap auf $true festlegen
https://learn.microsoft.com/de-de/dotnet/api/system.windows.forms.textbo ...
Zeppel
Moin,
AutoSize würde ich persönlich niemals deaktivieren. Bei mir hat jedes Fenster AutoSize und ich hatte noch nie Probleme damit.
Damit sich die Elemente automatisch verschieben benutze ich immer ein TableLayoutPanel.
Ich habe dir den Code mal ein bisschen umgeschrieben (wie ich finde einfach übersichtlicher, aber das ist natürlich auch ein Stück weit geschmackssache):
Gruß Thomas
Zitat von @Itchley:
Zu meinem Problem:
Der Benutzer muss an verschiedenen Stellen etwas Auswählen und ich wollte dies mit einer einfachen Klickoberfläche lösen; das klappt auch soweit bis auf die Formatierung der Überschrift. Diese ist unterschiedlich lang und mein Wunsch wäre es, wenn diese sich, wenn sie denn länger ist, nicht nach rechts ausbreitet sondern durch einen Zeilenumbruch nach unten erweitert und dabei die Schaltflächen nach unten schiebt.
kein Problem, einfach die MaximumSize-Eigenschaft mit einer gewünschten Breite versehen, z.B.:Zu meinem Problem:
Der Benutzer muss an verschiedenen Stellen etwas Auswählen und ich wollte dies mit einer einfachen Klickoberfläche lösen; das klappt auch soweit bis auf die Formatierung der Überschrift. Diese ist unterschiedlich lang und mein Wunsch wäre es, wenn diese sich, wenn sie denn länger ist, nicht nach rechts ausbreitet sondern durch einen Zeilenumbruch nach unten erweitert und dabei die Schaltflächen nach unten schiebt.
$MenuHeader.MaximumSize = "100,1000"
AutoSize würde ich persönlich niemals deaktivieren. Bei mir hat jedes Fenster AutoSize und ich hatte noch nie Probleme damit.
Damit sich die Elemente automatisch verschieben benutze ich immer ein TableLayoutPanel.
Ich habe dir den Code mal ein bisschen umgeschrieben (wie ich finde einfach übersichtlicher, aber das ist natürlich auch ein Stück weit geschmackssache):
#region Settings
using namespace System.Windows.Forms
using namespace System.Drawing
Add-Type -a System.Windows.Forms
[Application]::EnableVisualStyles()
$Font = @{
cons = [Font]::New("Consolas",20,[FontStyle]"Bold,Italic")
mss = [Font]::New("Microsoft Sans Serif",12)
}
#endregion Settings
#region Controls
$MenuBox = [Form]@{Text='Miau'; StartPosition="CenterScreen"; AutoSize=$True; FormBorderStyle="Fixed3D"; Font=$Font.mss; Padding="10,10,10,10"; TopMost=$true}
$TLP = [TableLayoutPanel]@{Dock="Fill"; AutoSize=$true}
$MenuHeader = [Label]@{AutoSize=$true; Font=$Font.cons; Text='Eine nun etwas längere Überschrift'; Anchor="Bottom"; MaximumSize="400,500"; TextAlign="MiddleCenter"}
$Buttons = @(
[Button]@{Name="Button0"; Size="500,30"; Text='Text für Schaltfläche 0'; Margin="10,10,10,10"}
[Button]@{Name="Button1"; Size="500,30"; Text='Text für Schaltfläche 1'; Margin="10,10,10,10"}
[Button]@{Name="Button2"; Size="500,30"; Text='Text für Schaltfläche 2'; Margin="10,10,10,10"}
[Button]@{Name="Button3"; Size="500,30"; Text='Text für Schaltfläche 3'; Margin="10,10,10,10"}
[Button]@{Name="Exit"; Anchor="Bottom"; Size="75,23"; Text='Exit'; Margin="10,10,10,10"}
)
#endregion Controls
#region Events
$Buttons.Add_Click({
$this.TopLevelControl.tag = $this.Name
$this.TopLevelControl.Hide()
})
#endregion Events
#region Layout
$TLP.Controls.Add($MenuHeader)
$TLP.Controls.AddRange($Buttons)
$MenuBox.Controls.Add($TLP)
#endregion Layout
#region run
[void]$MenuBox.ShowDialog()
#endregion run
#region result
$MenuBox.Tag
#endregion result
Gruß Thomas
Zitat von @Itchley:
@TK1987
Deiner ist schon deutlich eleganter...nur versteh ich den weniger als mein Konstrukt...
es ist im Prinzip genau das Selbe.@TK1987
Deiner ist schon deutlich eleganter...nur versteh ich den weniger als mein Konstrukt...
Du hast bisher zuerst ein Objekt einer Klasse erzeugt, dieses in einer Variable gespeichert und diesem dann nach und nach die Eigenschaftswerte zugewiesen... z.B.:
$MenuBox = New-Object System.Windows.Forms.Form
$MenuBox.Text = 'Miau'
$MenuBox.StartPosition = "CenterScreen"
$MenuBox.AutoSize = $True
$MenuBox = [System.Windows.Forms.Form]@{
Text = 'Miau'
StartPosition = "CenterScreen"
AutoSize = $true
}
Allein in einer eigenen Reiterkarte in ISE läufts
Von der Nutzung der ISE kann ich persönlich nur abraten. Nicht nur, das diese einige Bugs enthält, bei der Ausführung in der ISE laufen Sachen teils ganz anders ab als bei der normalen Ausführung.Falls du unbedingt eine IDE benötigst, rate ich dir eher zu Visual Studio Code mit Powershell-Plugin.
Ich persönlich schreibe alle Powershell-Skripte mit Notepad++.
Dort kann man sich auch einen Befehl abspeichern (und mit Tastenkombi versehen), um Powershell-Skripte von Notepad++ aus ausführen zu können.
bei mir im Skript im Austausch zur alten Version musste ich Zeile 2&3 rausschmeißen und egal was ich Auswähle, diese Box kommt in Dauerschleife
Seltsam, dass das dann überhaupt noch funktioniert (vermutlich auch wieder eine Eigenart der ISE).using-Zeilen müssen immer ganz am Anfang des Skripts stehen, also bitte nicht rausschmeissen, sondern einfach nach ganz oben setzen, dann funktioniert es
Wofür sind die Zeilen gut? Sie Sorgen einfach dafür, das du nicht immer den kompletten Paketpfad (System.Windows.Forms) zur Klasse angeben musst.
Du kannst dann also z.B. statt
New-Object System.Windows.Forms.Form
New-Object Form
[Form]@{}
Ohne die using-Zeilen dürfte der Code daher eigentlich gar nicht funktionieren, da die Klassen nicht gefunden werden können.
Gruß Thomas