Fenster nach Minimieren/maximieren auf vorherigen WindowState setzen

  • WPF
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Fenster nach Minimieren/maximieren auf vorherigen WindowState setzen

    Guten Morgen allerseits :)

    Ich habe ein Fenster mit WindowStyle = None und WindowState = WindowState.Maximized (im Originalzustand). Dazu habe ich mir eine eigene Titelleiste gebastelt. Mit einem Doppelklick auf die Titelleiste soll der Vollbildmodus (also Taskleiste verdeckt) an und ausgeschaltet werden. Dann gibt es noch einen Button zum Minimieren in die Taskleiste und einen Button zum Wechseln zwischen WindowState = WindowState.Normal und WindowState.Maximized.

    Nachdem das Fenster mit einem Klick auf den entsprechenden Button in die Taskleiste minimiert wurde, soll es bei einem Klick auf dessen Icon in der Taskleiste wieder in den Zustand direkt vor dem Minimieren gebracht werden.

    Das klappt auch ganz gut, wenn das Fenster vor dem Minimieren im WindowState.Normal war. Aber sobald es entweder Maximized oder im Vollbildmodus war, wird nach dem Klick in der Taskleiste, das Fenster erst ganz kurz maximiert und dann aber wieder in den Zustand .Normal gebracht, was ich so nicht will. Hier mein Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private FensterStatus As WindowState
    2. Private IstVollBild As Boolean = False
    3. Private Sub brdMinimieren_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
    4. FensterStatus = Me.WindowState
    5. Me.WindowState = WindowState.Minimized
    6. End Sub
    7. Private Sub brdVerkleinernVergroessern_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
    8. If Me.WindowState = WindowState.Normal Then
    9. If IstVollBild Then
    10. Me.WindowState = WindowState.Normal
    11. Me.WindowState = WindowState.Maximized
    12. Else
    13. Me.WindowStyle = Windows.WindowStyle.SingleBorderWindow
    14. Me.WindowState = WindowState.Maximized
    15. Me.WindowStyle = Windows.WindowStyle.None
    16. End If
    17. Else
    18. Me.WindowState = WindowState.Normal
    19. End If
    20. End Sub
    21. Private Sub Window_Activated(sender As Object, e As EventArgs)
    22. If Not FensterStatus = WindowState.Normal Then
    23. If IstVollBild Then
    24. Me.WindowState = WindowState.Normal
    25. Me.WindowState = WindowState.Maximized
    26. Else
    27. Me.WindowStyle = Windows.WindowStyle.SingleBorderWindow
    28. Me.WindowState = WindowState.Maximized
    29. Me.WindowStyle = Windows.WindowStyle.None
    30. End If
    31. Else
    32. Me.WindowState = WindowState.Normal
    33. End If
    34. End Sub


    Sieht jemand was ich falsch mache?
    Ich denke du brauchst einfach nur einen boolean, den stellst du auf true wenn du die Taskbar verdeckst. Das Window.StateChanged Event nutzen, wenn der WindowState dann Maximized ist dazu dann nichtIstVollbildSondernSollVollbildSein true ist bist du glaub ich da, wo du sein willst.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Ja, mann kann in einer Endlosschleife stecken bleiben. Aber viel zu kompliziert gedacht. So einfach ist das:

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private ohneRahmen As Boolean = False
    3. Private Sub ButtonMin_Click(sender As Object, e As RoutedEventArgs)
    4. WindowState = WindowState.Minimized
    5. End Sub
    6. Private Sub ButtonNoBorder_Click(sender As Object, e As RoutedEventArgs)
    7. ohneRahmen = Not ohneRahmen
    8. If ohneRahmen Then
    9. WindowStyle = WindowStyle.None
    10. WindowState = WindowState.Normal 'wenn rahmen vorhanden und bereits maximiert, wird die raskleiste sonst nicht verdeckt.
    11. WindowState = WindowState.Maximized
    12. Else
    13. WindowStyle = WindowStyle.SingleBorderWindow
    14. WindowState = WindowState.Normal
    15. End If
    16. End Sub
    17. Private Sub ButtonMax_Click(sender As Object, e As RoutedEventArgs)
    18. WindowState = WindowState.Maximized
    19. End Sub
    20. End Class
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Achso. Ja denn den alten State speichern, dann kannst du feststellen ob von minimiert zu OhneRahmen-Vollbild gewechselt wurde.

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private ohneRahmen As Boolean = False
    3. Private alterStatus As WindowState
    4. Private Sub ButtonMin_Click(sender As Object, e As RoutedEventArgs)
    5. WindowState = WindowState.Minimized
    6. End Sub
    7. Private Sub ButtonNoBorder_Click(sender As Object, e As RoutedEventArgs)
    8. ohneRahmen = Not ohneRahmen
    9. If ohneRahmen Then
    10. WindowStyle = WindowStyle.None
    11. WindowState = WindowState.Normal 'wenn rahmen vorhanden und bereits maximiert, wird die raskleiste sonst nicht verdeckt.
    12. WindowState = WindowState.Maximized
    13. Else
    14. WindowStyle = WindowStyle.SingleBorderWindow
    15. WindowState = WindowState.Normal
    16. End If
    17. End Sub
    18. Private Sub ButtonMax_Click(sender As Object, e As RoutedEventArgs)
    19. WindowState = WindowState.Maximized
    20. End Sub
    21. Private Sub Window_StateChanged(sender As Object, e As EventArgs)
    22. If ohneRahmen AndAlso alterStatus = WindowState.Minimized AndAlso WindowState = WindowState.Maximized Then
    23. ohneRahmen = False
    24. WindowStyle = WindowStyle.SingleBorderWindow
    25. End If
    26. alterStatus = WindowState
    27. End Sub
    28. End Class
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Beim Minimieren merkt der sich doch automatisch den State, den er vorher hatte. Das Activated Event und den FensterStatus brauchst du doch gar nicht.

    Das hier ist was ich nach deiner Beschreibung getan hätte:

    VB.NET-Quellcode

    1. Private Sub btn1_Click(sender As Object, e As RoutedEventArgs) Handles btn1.Click
    2. WindowState = WindowState.Minimized
    3. End Sub
    4. Private Sub btn2_Click(sender As Object, e As RoutedEventArgs) Handles btn2.Click
    5. If WindowState = WindowState.Normal Then
    6. WindowState = WindowState.Maximized
    7. Else
    8. WindowState = WindowState.Normal
    9. End If
    10. End Sub

    Du könntest die MaxHeigth/Width Properties setzen wenn du keinen Rahmen hast. Das funktioniert aber nur wenn die Taskleiste nicht automatisch ausgeblendet wird.
    Spoiler anzeigen

    C#-Quellcode

    1. private void Button_Maximize_Click(object sender, RoutedEventArgs e)
    2. {
    3. if (!withoutBorder)
    4. {
    5. // Mit Rahmen, wird die Taskleiste angezeigt
    6. MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
    7. MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
    8. }
    9. else
    10. {
    11. // Ohne Rahmen, wird die Taskleiste verdeckt.
    12. ClearValue(MaxHeightProperty);
    13. ClearValue(MaxWidthProperty);
    14. }
    15. if (WindowState == WindowState.Maximized)
    16. {
    17. WindowState = lastWindowState;
    18. }
    19. else
    20. {
    21. lastWindowState = WindowState;
    22. WindowState = WindowState.Maximized;
    23. }
    24. }

    @Haudruferzappeltnoch

    Ich wünschte es wäre so...

    Ich mache beim Programmstart das hier:

    VB.NET-Quellcode

    1. Me.WindowStyle = Windows.WindowStyle.SingleBorderWindow
    2. Me.WindowState = WindowState.Maximized
    3. Me.WindowStyle = Windows.WindowStyle.None


    Egal wie ich es mach, wenn ich es aus der Taskleiste heraus anklicke, dann geht er entweder komplett in Vollbildmodus oder halt auf Normal. Nicht aber ins normale Maximized, also "Vollbild" aber mit sichtbarer Taskleiste...

    @Fakiz

    Was meinst mit automatisch ausgeblendet?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()

    kafffee schrieb:

    Nicht aber ins normale Maximized, also "Vollbild" aber mit sichtbarer Taskleiste..
    Ok ich glaub ich weiß nicht was normal und was unnormal maximiert ist. Ich habe immer eine sichtbare Taskleiste.
    Bist du auf Win11 unterwegs? Vielleicht isses da anders.

    Warum weist du den WindowStyle zweimal zu? Und das wirkt sich außerdem bei mir nicht auf das Minimierungsverhalten aus.
    Damit war die Taskleisteneinstellung gemeint (Personalisierung > Taskleiste > Verhalten der Taskleiste > Taskleiste automatisch ausblenden).
    Wenn die Taskleiste nicht automatisch ausgeblendet wird kannst du MaximizedPrimaryScreenHeight als Maximal höhe für dein Fenster nehmen in dem fall kann dein Fenster die Taskleiste im Fullscreen nicht überdecken.
    @Fakiz

    Yep das isses. Musste zwar noch ein bisschen rumfrisieren aber es klappt. Auch wenn man die Taskleiste ausblendet verhält es sich wie es soll:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private IstVollBild As Boolean = False
    2. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    3. Me.WindowStyle = Windows.WindowStyle.SingleBorderWindow
    4. Me.WindowState = WindowState.Maximized
    5. Me.WindowStyle = Windows.WindowStyle.None
    6. Me.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight
    7. Me.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth
    8. End Sub
    9. Private Sub lblTitelLeiste_DoubleClick (sender As Object, e As MouseButtonEventArgs) 'Doppelklick auf Titelleiste für Vollbild an/aus
    10. If IstVollBild Then
    11. Me.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight
    12. Me.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth
    13. Me.WindowState = WindowState.Normal
    14. Me.WindowState = WindowState.Maximized
    15. IstVollBild = False
    16. Else
    17. ClearValue(MaxHeightProperty)
    18. ClearValue(MaxWidthProperty)
    19. Me.WindowState = WindowState.Normal
    20. Me.WindowState = WindowState.Maximized
    21. Me.Height = SystemParameters.PrimaryScreenHeight
    22. Me.Width = SystemParameters.PrimaryScreenWidth
    23. IstVollBild = True
    24. End If
    25. End Sub
    26. Private Sub brdMinimieren_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs) 'Programm in die Taskleiste minimieren
    27. FensterStatus = Me.WindowState
    28. Me.WindowState = WindowState.Minimized
    29. End Sub
    30. Private Sub Window_Activated(sender As Object, e As EventArgs) 'wenn Programm in den Vordergrund kommt oder von Taskleiste vergrössert wird
    31. If Not IstVollBild Then
    32. Me.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight
    33. Me.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth
    34. Else
    35. ClearValue(MaxHeightProperty)
    36. ClearValue(MaxWidthProperty)
    37. End If
    38. End Sub
    39. Private Sub brdVerkleinern_MouseLeftButtonDown_1(sender As Object, e As MouseButtonEventArgs) 'klick auf verkleinern/vergrössern-Taste
    40. If WindowState = WindowState.Normal Then
    41. WindowState = WindowState.Maximized
    42. ElseIf WindowState = WindowState.Maximized Then
    43. WindowState = WindowState.Normal
    44. End If
    45. End Sub