2017-04-20 3 views
1

Ich möchte WindowState=Normal während Visible == false setzen können, aber das Durchlaufen des Codes zeigt, dass es auf Maximized zurückgesetzt wird, gleich nachdem Visibility = true eingestellt wurde.So ändern Sie WindowState, wenn das Formular nicht sichtbar ist

Dies ist die kleinste Stichprobe, um das Verhalten zu reproduzieren. Die eigentliche Aufgabe besteht darin, auf eine Schaltfläche in einem maximierten Formular zu klicken und sie an einem anderen Ort und einer anderen Größe als RestoreBounds wiederherzustellen, ohne zuerst die Größe zu ändern und dann die Größe zu ändern. Es ist visuell ablenkend. Natürlich funktioniert es gut, wenn die Sichtbarkeitsänderungen auskommentiert sind.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.Visible = false; 
     this.WindowState = FormWindowState.Normal; 
     this.Visible = true; 
    } 
} 
  1. Run App
  2. Maximize Form
  3. Click-Taste

Die Form noch blinken, aber maximiert werden. Ich habe versucht, die Grenzen mit SetDesktopBounds, Show, Refresh manuell einzustellen und sogar BeginInvoke auf dem Aufruf sichtbar = wahr nur um sicherzustellen, dass die zugrunde liegende Nachricht Pumpe eine Chance zu verarbeiten bekommt.

Antwort

2

Sie kämpfen mit der Art und Weise, wie Fenster nativ arbeiten. Winforms geht aus dem Weg, es Look wie WindowState und Visible sind separate Eigenschaften, aber sie sind nicht unter der Haube. Es dauert einen einzigen Winapi-Aufruf, um beide zu ändern, etwas unweigerlich gewinnt der letzte.

Dies kann bastelt werden, indem Sie das Winapi selbst anrufen. Wie folgt aus:

using System.Runtime.InteropServices; 
... 
    [DllImport("user32.dll")] 
    private static extern bool ShowWindow(IntPtr hWnd, int state); 
    private const int SW_SHOWNORMAL = 1; 

und ändern Sie Ihre Click-Ereignishandler:

private void button1_Click(object sender, EventArgs e) { 
     this.Visible = false; 
     ShowWindow(this.Handle, SW_SHOWNORMAL); 
     this.WindowState = FormWindowState.Normal; 
     this.Visible = true; 
    } 

Welche tut, was Sie wollen. Obwohl die Eigenschaftszuweisungen jetzt überflüssig erscheinen, ist es sehr wichtig, dass Sie sie behalten und sicherstellen, dass sie dem von Ihnen übergebenen ShowWindow() Argument entsprechen. Die Eigenschaften-Setter ändern einige interne Flags, die verwendet werden, um die Illusion aufrechtzuerhalten, dass Visible und WindowState nicht verwandt sind. Ich kann nicht garantieren, dass dieser Hack keine Probleme verursacht.

+0

Danke. Ich hatte beide zusammen vermisst. So nah und doch so fern. –

+0

Das Testformular muss einfach schnell genug sein, damit es so aussieht, als würde es funktionieren. Wenn es in vollem Code implementiert ist, ist der Flash der vorherigen 'DesktopBounds' immer noch da. Beendet mit "Opazität" statt Sichtbarkeit und erreicht, was ich brauche. Vielen Dank für Ihre Zeit. –

Verwandte Themen