Entwickler-Ecke

WinForms - Fenster sichtbarkeit toggeln


Macoy - Di 11.04.06 09:53
Titel: Fenster sichtbarkeit toggeln
Hallo,

Ich habe ein MDI mit mehrenen Tool-Fenstern. Dazu ein Menupunkt "Ansicht" in dem man die Sichtbarkeit dieser Toolfenster toggeln kann. Dieses Umschalten realisiere ich mit:


C#-Quelltext
1:
2:
3:
4:
if(toolWin.Visible)
  toolWin.Hide();
else
  toolWin.Show();


Soweit sogut... Wenn der User aber die Idee kommt, das toolWin mit einem Klick aufs Kreuzchen (Fenster schliessen) zuzumachen, funktioniert dieser Mechanismus nicht mehr. Ich kann weder das Fenster sichtbar machen, noch bekomme ich eine Nullpointer Exception ... Was passiert mit dem Fenster ? Zu Null wird es jedenfalls nicht - also muss es doch noch irgendwo herumschwirren.


Kha - Di 11.04.06 16:16
Titel: Re: Fenster sichtbarkeit toggeln
Zitat:
Was passiert mit dem Fenster ?

Es ist disposed, ist also wenigstens zur Anzeige nicht mehr nutzbar.
user profile iconMacoy hat folgendes geschrieben:
Zu Null wird es jedenfalls nicht
Wie sollte denn das funktionieren :gruebel: ? Eine Klasse kann ja schlecht die Variablen, die eine Referenz auf sie halten, beeinflussen.


Martin1966 - Di 11.04.06 16:32

Hallo Macoy :wink2:

Verwende am besten das OnClose Event des Toolfensters. Dort legst du dann über die Variable Action fest das nicht freigegeben wird sondern nur verborgen (caHide).

Lg Martin


Robert_G - Mi 12.04.06 00:30

user profile iconMacoy hat folgendes geschrieben:
Dieses Umschalten realisiere ich mit:

C#-Quelltext
1:
2:
3:
4:
if(toolWin.Visible)
  toolWin.Hide();
else
  toolWin.Show();
Wie wär's so?

C#-Quelltext
1:
toolWindow.Visible = !toolWindow.Visible;                    

Zitat:
Soweit sogut... Wenn der User aber die Idee kommt, das toolWin mit einem Klick aufs Kreuzchen (Fenster schliessen) zuzumachen,
Schaue dir mal den FormClosing event an.
Da kannst du gezielt dann Cancel setzen, wenn der User dein Child schließen wollte.

C#-Quelltext
1:
e.Cancel = (e.CloseReason == CloseReason.UserClosing);                    

Zitat:
funktioniert dieser Mechanismus nicht mehr. Ich kann weder das Fenster sichtbar machen, noch bekomme ich eine Nullpointer Exception ... Was passiert mit dem Fenster ? Zu Null wird es jedenfalls nicht - also muss es doch noch irgendwo herumschwirren.
Wie Klaradings schon sagte, es wurde Dipose ausgeführt, welches bei jedem Control das versteckte Win32-Fenster zerstört. Du hast zu dem Zeitpunkt kein richtiges Control mehr. Nur noch eine sinnlose "Hülle".
Ein Form, das mit Show gezeigt wird, wird durch Close sofort vernichtet. Bei ShowModal bist du wiederum dafür zuständig. [meta]Wenn du nicht erst auf den Finalizer warten willst[/meta]

@Martin, wieder verlaufen? :mrgreen:


Kha - Mi 12.04.06 08:52

user profile iconRobert_G hat folgendes geschrieben:
user profile iconMacoy hat folgendes geschrieben:
Dieses Umschalten realisiere ich mit:

C#-Quelltext
1:
2:
3:
4:
if(toolWin.Visible)
  toolWin.Hide();
else
  toolWin.Show();
Wie wär's so?

C#-Quelltext
1:
toolWindow.Visible = !toolWindow.Visible;                    

Das geht aber noch kürzer :mrgreen: .

C#-Quelltext
1:
toolWin.Visible ^= true;                    

Über die Lesbarkeit lässt sich streiten :| ;) .

[OT] Hui, diese BuiltIn-Code-Tags in Quotes sind ja nett :D . Dafür blinkt mein Cursor mit dem FF wie ein Verrückter :| . [/OT]


Macoy - Mo 17.04.06 14:30

Danke, ihr ward echt ne Hilfe !


Das mit


C#-Quelltext
1:
2:
3:
4:
5:
toolWindow.Visible = !toolWindow.Visible;

oder 
  
toolWin.Visible ^= true;


ist wohl eher Geschmackssache... Ich mag es eher explizit, damit ich in nem halben Jahr immernoch auf einen Blick weiss, was das passiert.