2016-08-17 6 views
0

Ich arbeite an einer Anwendung C# WPF. Ich habe meine eigene Titelleiste und habe die Funktion "Schließen", "Minimieren" und "Maximieren" programmiert. Ich arbeite am PC mit 2 Bildschirmen und ich habe ein Problem, wenn ich Fenster maximiere. Im Hauptbildschirm, wenn ich WindowState = WindowState.Maximized eingestellt habe, ist die Taskleiste (die Leiste von Windows 7) ausgeblendet. Ich habe eine Funktion hinzugefügt, um MaxHeight abhängig vom Bildschirm einzustellen, aber wenn ich MaxHeight ändere, ändert sich die ActualHeight nicht. Konkret, wenn ich das Fenster maximiere, wird das Fenster im Vollbildmodus angezeigt. Beim zweiten Mal, wenn ich maximiere, ist die Höhe korrekt, die Taskleiste ist nicht ausgeblendet.Ändern von Windows.MaxHeight nicht Höhe ändern

Was kann ich tun, um die Höhe zu aktualisieren, wenn MaxHeight geändert wird?

Hier ist mein Code:

protected override void OnStateChanged(EventArgs e) 
    { 
     base.OnStateChanged(e); 
     if (WindowState == WindowState.Maximized) 
     { 
      var hwnd = new System.Windows.Interop.WindowInteropHelper(this).EnsureHandle(); 
      var currentMonitor = NativeMethods.MonitorFromWindow(hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST); 
      var primaryMonitor = NativeMethods.MonitorFromWindow(IntPtr.Zero, NativeMethods.MONITOR_DEFAULTTOPRIMERTY); 
      var isInPrimary = currentMonitor == primaryMonitor; 

      if (isInPrimary) 
       this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; 
      else 
       this.MaxHeight = Double.PositiveInfinity; 
#if DEBUG 
      var aH = this.ActualHeight; 
      var h = this.Height; 
      var mH = this.MaxHeight; 
      if (aH != h || aH > mH) 
      { 
       System.Diagnostics.Debugger.Break(); 
       this.Height = this.MaxHeight; 
      }    
#endif 
     } 
    } 
+1

Das Ändern der Height-Eigenschaft in einem maximierten Fenster kann keine Auswirkungen haben. Die Einstellung von MaxHeight * nach * Maximierung des Fensters kann keinen Einfluss haben, Sie müssen es tun * bevor * es maximiert wird. Google "wpf vermeiden Taskleiste Überlappung auf randlosen Fenster", um herauszufinden, wie es richtig geht. –

+0

In der Tat, ich habe dieses Stück Code vor dem Maximieren bewegen und es funktioniert gut. Vielen Dank ! –

Antwort

0

Ich bin kein Spezialist in C# aber hatte dieses Problem in Pascal/Delphi. Ich hatte die Größe des Formulars wie so manuell angeben:

procedure MinMax; 
begin 
    if Form.WindowState=wsNormal then 
    begin 
     Form.WindowState:=wsMaximized; 
     with Screen.WorkAreaRect do 
      Form.SetBounds(Left, Top, Right - Left, Bottom - Top); 
    end 
    else 
    begin 
     Form1.WindowState:=wsNormal; 
    end; 
end; 

Die Screen.WorkAreaRect gibt Ihnen das aktuelle Rechteck ohne die Taskleiste-Region, die oben/links/unten/rechts platziert werden kann.

Hoffe, dass Ihnen helfen könnte.

+0

Ich habe so etwas versucht, aber wenn ich auf die Methode 'OnStateChanged' gehe, wird der neue Wert nicht berücksichtigt. –

+0

Diese Frage wurde bereits von Per in diesem Thread beantwortet: http://Stackoverflow.com/a/6415176/5471509 – BionicWave

+0

Dieser Thread ist für Windows Form, 'Screen.PrimaryScreen.WorkingArea' existiert nicht in WPF –