2016-10-24 5 views
1

Ich habe ein Problem über den Wiederherstellungsstatus des Fensters, wenn ich es auf dem sekundären Monitor maximiert habe. Ich maximierte das Fenster auf dem nicht primären Bildschirm und schloss es dann. Wenn Sie das Fenster erneut öffnen, wird es ebenfalls maximiert, aber es wird auf dem primären Bildschirm maximiert. Ich möchte auf dem nicht primären Bildschirm maximiert werden (das Bildschirmfenster beim Schließen).Maximierten Zustand wiederherstellen auf sekundärem Monitor

Bitte helfen Sie mir, wenn Sie es wissen.

Hinweis: Wenn der Fensterstatus normal ist, wird das Fenster korrekt wiederhergestellt.

Mein Code unten ein:

if (ShellState == WindowState.Maximized) 
     { 
      ShellState = WindowState.Normal; 
      LeftPosition = Screen.AllScreens[selectedScreen].WorkingArea.Left; 
      TopPosition = Screen.AllScreens[selectedScreen].WorkingArea.Top; 
      ShellHeight = Screen.AllScreens[selectedScreen].WorkingArea.Height; 
      ShellWidth = Screen.AllScreens[selectedScreen].WorkingArea.Width; 
      ShellState = WindowState.Maximized; 
     } 

Antwort

1

Wir sind auf viele Probleme hatten, Multi-Screen-Systeme, die Standard-WPF-Tools zum Speichern und Wiederherstellen des Fensterstatus und Größe verwenden, solange die Bildzuordnung.

Wir sind mit der Erstellung eines benutzerdefinierten Verhaltens, das die nativen WinAPI-Funktionen verwendet, fertig. Hier ist der (vereinfachte) Quellcode unseres Verhaltens. Sie können es in Ihrer Anwendung anstelle der WPF-Tools verwenden.

Sie müssen ändern, wie die Fensterplatzierung gespeichert wird. Dies kann eine Abhängigkeitseigenschaft sein, die einen Container, eine statische Properties.Settings Referenz oder etwas anderes bereitstellt. Im folgenden Code wird eine statische ApplicationSettings Referenz als Beispiel verwendet.

class WindowPlacementPersistenceBehavior : Behavior<Window> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     this.AssociatedObject.SourceInitialized += this.AssociatedObject_SourceInitialized; 
     this.AssociatedObject.Closing += this.AssociatedObject_Closing; 
    } 

    protected override void OnDetaching() 
    { 
     this.AssociatedObject.SourceInitialized -= this.AssociatedObject_SourceInitialized; 
     this.AssociatedObject.Closing -= this.AssociatedObject_Closing; 
     base.OnDetaching(); 
    } 

    private void AssociatedObject_Closing(object sender, CancelEventArgs e) 
    { 
     WINDOWPLACEMENT wp; 
     NativeMethods.GetWindowPlacement(new WindowInteropHelper(this.AssociatedObject).Handle, out wp); 

     // Here you can store the window placement 
     ApplicationSettings.WindowPlacement = wp.ToString(); 
    } 

    private void AssociatedObject_SourceInitialized(object sender, EventArgs e) 
    { 
     // Here you can load the window placement 
     WINDOWPLACEMENT wp = WINDOWPLACEMENT.Parse(ApplicationSettings.WindowPlacement); 
     if (wp.ShowCmd == NativeMethods.SW_SHOWMINIMIZED) 
     { 
      // Don't start in the minimized state 
      wp.ShowCmd = NativeMethods.SW_SHOWNORMAL; 
     } 

     try 
     { 
      NativeMethods.SetWindowPlacement(new WindowInteropHelper(this.AssociatedObject).Handle, ref wp); 
     } 
     catch 
     { 
     } 
    } 

    [Serializable] 
    [StructLayout(LayoutKind.Sequential)] 
    private struct RECT 
    { 
     public int Left; 
     public int Top; 
     public int Right; 
     public int Bottom; 

     public static RECT Parse(string input) 
     { 
      RECT result; 
      string[] items = input.Split(';'); 
      result.Left = int.Parse(items[0]); 
      result.Top = int.Parse(items[1]); 
      result.Right = int.Parse(items[2]); 
      result.Bottom = int.Parse(items[3]); 
      return result; 
     } 

     public override string ToString() 
     { 
      return this.Left + ";" + this.Top + ";" + this.Right + ";" + this.Bottom; 
     } 
    } 

    [Serializable] 
    [StructLayout(LayoutKind.Sequential)] 
    private struct POINT 
    { 
     public int X; 
     public int Y; 

     public static POINT Parse(string input) 
     { 
      POINT result; 
      string[] items = input.Split(';'); 
      result.X = int.Parse(items[0]); 
      result.Y = int.Parse(items[1]); 
      return result; 
     } 

     public override string ToString() 
     { 
      return this.X + ";" + this.Y; 
     } 
    } 

    [Serializable] 
    [StructLayout(LayoutKind.Sequential)] 
    private struct WINDOWPLACEMENT 
    { 
     public int Length; 
     public int Flags; 
     public int ShowCmd; 
     public POINT MinPosition; 
     public POINT MaxPosition; 
     public RECT NormalPosition; 

     public static WINDOWPLACEMENT Parse(string input) 
     { 
      WINDOWPLACEMENT result = default(WINDOWPLACEMENT); 
      result.Length = Marshal.SizeOf(typeof(WINDOWPLACEMENT)); 
      try 
      { 
       string[] items = input.Split('/'); 
       result.Flags = int.Parse(items[0]); 
       result.ShowCmd = int.Parse(items[1]); 
       result.MinPosition = POINT.Parse(items[2]); 
       result.MaxPosition = POINT.Parse(items[3]); 
       result.NormalPosition = RECT.Parse(items[4]); 
      } 
      catch 
      { 
      } 

      return result; 
     } 

     public override string ToString() 
     { 
      return this.Flags + "/" + this.ShowCmd + "/" + this.MinPosition.ToString() + "/" + this.MaxPosition.ToString() + "/" + this.NormalPosition.ToString(); 
     } 
    } 

    private static class NativeMethods 
    { 
     public const int SW_SHOWNORMAL = 1; 
     public const int SW_SHOWMINIMIZED = 2; 

     [DllImport("user32.dll")] 
     public static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref WINDOWPLACEMENT lpwndpl); 

     [DllImport("user32.dll")] 
     public static extern bool GetWindowPlacement(IntPtr hWnd, [Out] out WINDOWPLACEMENT lpwndpl); 
    } 
} 

dieses Verhalten zu verwenden, fügen Sie einfach es in XAML zu Ihrem Fenster:

<Window 
    xmlns:v="clr-namespace:YourNameSpace" 
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"> 
<i:Interaction.Behaviors> 
    <v:WindowPlacementPersistenceBehavior /> 
</i:Interaction.Behaviors> 
</Window> 
Verwandte Themen