Xmlform location changed
Guten Morgen zusammen,
ich habe mir mit wpf ein Userform gebaut.
Dieses darf aber nicht aus dem Bildschirm hinausgeschoben werden.
Mit nem normalen windows form funktioniert das auch.
Nur leider nicht mit diesem. Hier der Code.
Habe schon $TimerForm.RegionChanged in verschiedenen Varianen probiert. Keine Geht.
Vielleicht hat einer von Euch ne Idee?
Viele Grüße
gfritz74
ich habe mir mit wpf ein Userform gebaut.
Dieses darf aber nicht aus dem Bildschirm hinausgeschoben werden.
Mit nem normalen windows form funktioniert das auch.
Nur leider nicht mit diesem. Hier der Code.
#Alle Variablen aus vorherigen Ausführungen entfernen
Remove-Variable * -ErrorAction SilentlyContinue
$ErrorActionPreference = "Continue"
#Assemblys laden
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName Presentationframework
# Bildschirmgröße ermitteln
$Screen = [Windows.Forms.Screen]::PrimaryScreen.WorkingArea | Select Width,Height
#####################
# Script Funktionen #
#####################
#Function für Timer
Function Create-GetSchedTime {
Param(
$SchedTime
)
$script:StartTime = (Get-Date).AddSeconds($TotalTime)
$RestartDate = ((get-date).AddSeconds($TotalTime)).AddMinutes(-5)
$RDate = (Get-Date $RestartDate -f 'dd.MM.yyyy') -replace "\.","/" # 16/03/2016
$RTime = Get-Date $RestartDate -f 'HH:mm' # 09:31
#&schtasks /delete /tn "Post Maintenance Restart" /f
#&schtasks /create /sc once /tn "Post Maintenance Restart" /tr "'C:\Windows\system32\cmd.exe' /c shutdown -r -f -t 300" /SD $RDate /ST $RTime /f
}
#Function TimerForm
Function TimerForm{
[xml]$Timer_Form = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Computer Reboot Notifcation" Icon="C:\Users\fritz\source\repos\WpfApp1\Warnung.png" Height="446" Width="725" ResizeMode="NoResize" Topmost="True" WindowStartupLocation="CenterScreen" Background="White" FontFamily="Arial Black" ShowInTaskbar="False" SizeToContent="WidthAndHeight">
<Grid Margin="15,15,15,15">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="Nach der Installation von Sicherheitsupdates ist ein Neustart des Computers zwingend erforderlich.
Dieser ist auch nach mehreren Hinweisen nicht erfolgt.
Zur Wahrung der Sicherheitsniveuas muss dieser Heute erfolgen.
Sie haben nun noch einmalig die Möglichkeit den Restart zu verschieben.
Ansonsten sichern Sie Ihre Daten, schließen die geöffneten Anwendungen 
und klicken anschließend auf den Button Neustart.

WARNUNG: Der Rechner wird nach Ablauf der Zeit neu gestartet!

Vielen Dank ihr IT-Services-Team" FontFamily="Arial" FontWeight="Bold" FontSize="14" Padding="10,10,10,10" RenderTransformOrigin="0.5,0.5" Margin="0,0,0,200">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform AngleX="0"/>
<RotateTransform/>
<TranslateTransform X="0"/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label Content="Label Timer" HorizontalAlignment="Left" Margin="0,190,0,0" VerticalAlignment="Top" Height="56" Width="340" FontFamily="Arial Black" FontWeight="Bold" FontSize="40" Foreground="Red"/>
<Grid Margin="10,270,10,0">
<Button x:Name="B_Neustart" Content="Neustart" HorizontalAlignment="Left" Margin="0,20,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.393,0.489" Width="120" Height="50" FontFamily="Arial" FontWeight="Bold"/>
<Button x:Name="B_1Hour" Content="1 Stunde
verzögern" HorizontalAlignment="Left" Margin="140,20,0,0" VerticalAlignment="Top" Width="120" Height="50" FontFamily="Arial" FontWeight="Bold"/>
<Button x:Name="B_4hour" Content="4 Stunden
verzögern" HorizontalAlignment="Left" Margin="280,20,0,0" VerticalAlignment="Top" Width="120" Height="50" FontFamily="Arial" FontWeight="Bold"/>
<Image HorizontalAlignment="Left" Height="99" VerticalAlignment="Top" Width="120" Margin="545,0,0,0" Source="C:\Users\fritz\source\repos\WpfApp1\IS_Logo.bmp" Stretch="Fill"/>
</Grid>
<Grid Margin="-1030,0,1030,133"/>
</Grid>
</Window>
"@
#Create a form
$XMLReader = (New-Object System.Xml.XmlNodeReader $Timer_Form)
$TimerForm = [Windows.Markup.XamlReader]::Load($XMLReader)
$NeustartButton = $XMLForm.FindName('B_Neustart')
$NeustartButton.add_click({write-host ich habe es geschafft,$XMLForm.Close()})
# Position auf Bildschirm begrenzen
$TimerForm.RegionChanged({
switch ($this.Location) {
{$_.X -lt 0} { $this.Location = "0,{0}" -f $_.Y }
{$_.Y -lt 0} { $this.Location = "{0},0" -f $_.Y }
{($_.X+$this.Size.Width) -gt $Screen.Width} { $this.Location = "{0},{1}" -f ($Screen.Width-$this.Size.Width), $_.Y }
{($_.Y+$this.Size.Height) -gt $Screen.Height} { $this.Location = "{0},{1}" -f $_.X, ($Screen.Height-$this.Size.Height) }
}})
$TimerForm.ShowDialog()
}
Habe schon $TimerForm.RegionChanged in verschiedenen Varianen probiert. Keine Geht.
Vielleicht hat einer von Euch ne Idee?
Viele Grüße
gfritz74
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1338656663
Url: https://administrator.de/contentid/1338656663
Ausgedruckt am: 25.11.2024 um 14:11 Uhr
15 Kommentare
Neuester Kommentar
Einfach den WindowStyle auf None ändern, schon ist Verschieben Geschichte...
btw. du verwendest da einige falsche Variablen wie $XMLForm die es gar nicht gibt ... deswegen funktioniert da auch nix.
btw. du verwendest da einige falsche Variablen wie $XMLForm die es gar nicht gibt ... deswegen funktioniert da auch nix.
$TimerForm.RegionChanged
Ebenso hier, erstens muss man Methoden mit add Prefix ansprechen udn zweitens ist das RegionChanged nicht das man bräuchte das wäre "LocationChanged".#Assemblys laden
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName Presentationframework
# Bildschirmgröße ermitteln
$Screen = [Windows.Forms.Screen]::PrimaryScreen.WorkingArea | Select Width,Height
#Function TimerForm
Function TimerForm{
[xml]$Timer_Form = @"
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Computer Reboot Notifcation" Height="446" Width="725" ResizeMode="NoResize" Topmost="True" WindowStartupLocation="CenterScreen" Background="White" FontFamily="Arial Black" ShowInTaskbar="False" SizeToContent="WidthAndHeight" WindowStyle="None">
<Grid Margin="15,15,15,15">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="Nach der Installation von Sicherheitsupdates ist ein Neustart des Computers zwingend erforderlich.
Dieser ist auch nach mehreren Hinweisen nicht erfolgt.
Zur Wahrung der Sicherheitsniveuas muss dieser Heute erfolgen.
Sie haben nun noch einmalig die Möglichkeit den Restart zu verschieben.
Ansonsten sichern Sie Ihre Daten, schließen die geöffneten Anwendungen
und klicken anschließend auf den Button Neustart.
WARNUNG: Der Rechner wird nach Ablauf der Zeit neu gestartet!
Vielen Dank ihr IT-Services-Team" FontFamily="Arial" FontWeight="Bold" FontSize="14" Padding="10,10,10,10" RenderTransformOrigin="0.5,0.5" Margin="0,0,0,200">
<Label.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform AngleX="0"/>
<RotateTransform/>
<TranslateTransform X="0"/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label Content="Label Timer" HorizontalAlignment="Left" Margin="0,190,0,0" VerticalAlignment="Top" Height="56" Width="340" FontFamily="Arial Black" FontWeight="Bold" FontSize="40" Foreground="Red"/>
<Grid Margin="10,270,10,0">
<Button x:Name="B_Neustart" Content="Neustart" HorizontalAlignment="Left" Margin="0,20,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.393,0.489" Width="120" Height="50" FontFamily="Arial" FontWeight="Bold"/>
<Button x:Name="B_1Hour" Content="1 Stunde
verzögern" HorizontalAlignment="Left" Margin="140,20,0,0" VerticalAlignment="Top" Width="120" Height="50" FontFamily="Arial" FontWeight="Bold"/>
<Button x:Name="B_4hour" Content="4 Stunden
verzögern" HorizontalAlignment="Left" Margin="280,20,0,0" VerticalAlignment="Top" Width="120" Height="50" FontFamily="Arial" FontWeight="Bold"/>
<Image HorizontalAlignment="Left" Height="99" VerticalAlignment="Top" Width="120" Margin="545,0,0,0" Source="C:\Users\fritz\source\repos\WpfApp1\IS_Logo.bmp" Stretch="Fill"/>
</Grid>
<Grid Margin="-1030,0,1030,133"/>
</Grid>
</Window>
"@
#Create a form
$XMLReader = (New-Object System.Xml.XmlNodeReader $Timer_Form)
$TimerForm = [Windows.Markup.XamlReader]::Load($XMLReader)
$NeustartButton = $TimerForm.FindName('B_Neustart')
$NeustartButton.add_click({$TimerForm.Close()})
$TimerForm.ShowDialog()
}
TimerForm
Es soll ja verschiebbar sein, aber nicht aus dem Bildschirm hinaus.
As simple as that.$timerform.add_LocationChanged({
if ($this.Left -lt 0){$this.Left = 0}
if ($this.Top -lt 0){$this.Top = 0}
if ($this.Top + $this.Height -gt $Screen.Height){$this.Top = $screen.Height - $this.Height}
if ($this.Left + $this.Width -gt $Screen.Width){$this.Left = $screen.Width - $this.Width}
})
Ist ja auch Blödsinn das brauchst du nicht! Die 4 Prüfungen machen das schon auch für das nach Rechts oder nach unten raus schieben, einfach mal zur Abwechslung das Oberstübchen einschalten .
Zitat von @gfritz74:
Sorry aber ich versteh nicht worauf Du hinauswillst.
Ich muss doch irgendwie angeben das der nach allen vier seiten nicht raus schiebbar sein soll.
Das macht das schon, einfach mal die letzten beiden If-Abfragen lesen, dann wird dir klar das das mit diesen schon gemacht wird !!Sorry aber ich versteh nicht worauf Du hinauswillst.
Ich muss doch irgendwie angeben das der nach allen vier seiten nicht raus schiebbar sein soll.
Die Fenster-Position wird nur über die linke obere Ecke festgelegt, nicht über rechts oder unten!
if ($this.Top + $this.Height -gt $Screen.Height){$this.Top = $screen.Height - $this.Height}
Bedeutet was ? Genau: Wenn die TOP Position des Fensters + Höhe des Fensters selbst größer als die Höhe des Desktops ist dann lege die Position via TOP Eigenschaft auf TOP Position des Fensters + Höhe des Fensters fest, somit kann das Fenster aus Prinzip nie weiter nach unten aus dem Desktop geschoben werden ... genau das Gleiche eben nur für die Left Position hierif ($this.Left + $this.Width -gt $Screen.Width){$this.Left = $screen.Width - $this.Width}
Nur das hier eben das Hinausschieben über den rechten Rand nicht mehr ermöglicht wird anstatt nach untenJetzt verstanden? Ist doch wirklich nicht so schwer ...
Dann hast du wohl einen "erweiterten Screen" der auf einen anderen Monitor erweitert wird, wenn deine Working Area größer ist das der einzelne Monitor. Klappt hier wie zu erwarten übrigens einwandfrei.
Ja die musst du da als Faktor mit einbeziehen
$scale = 96 / [int](Get-ItemPropertyValue HKCU:\Software\Microsoft\Windows\CurrentVersion\ThemeManager -Name LastLoadedDPI)
Habe die $screen abfrage geändert in
$Screen = ([System.Windows.Forms.Screen]::AllScreens |? Primary).Bounds.Size
Da ist dann zwar die Taskleiste mit inkludiert, aber naja ...$Screen = ([System.Windows.Forms.Screen]::AllScreens |? Primary).Bounds.Size
Zitat von @gfritz74:
Würdest du mir noch bei einer anderen Sache helfen? Ich muss einen Reboot timer in das LabelTime einbauhen.
Würdest du mir noch bei einer anderen Sache helfen? Ich muss einen Reboot timer in das LabelTime einbauhen.
Als Denkanstoß zum selbst machen:
New-Object System.Windows.Forms.Timer
https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.timer?v ...
Methoden "Start()" zum Starten des Timers, "Stop()" zum stoppen, Property "Interval" zum setzen der Aktualisierungsrate und Event "Tick" welches im definierten Interval aufgerufen wird (Wie du Events abbonierst hast du hier ja schon gelernt, hoffentlich). Damit solltest du jetzt auch selbst klar kommen.
Und wie immer Thread schließen wenn das Thema im Ursprungsbeitrag abgeschlossen wurde!