2017-10-29 4 views
0

Öffnungs ich mich gefragt, ob es eine effizientere Art und Weise ist in WPF ein neues Fenster zu öffnen, als wie unten in Code dargestellt:Ein richtiger Weg, um neue wpf Fenster

WindowConfigureDatabase windowConfigureDatabse;  

private void ButtonConfigureDatabase_Click(object sender, RibbonControlEventArgs e) 
    { 
     if (windowConfigureDatabase == null) 
     { 
      windowConfigureDatabase = new WindowConfigureDatabase(); 
     } 

     windowConfigureDatabase.Clear(); 
     windowConfigureDatabase.Show(); 
     windowConfigureDatabase.WindowState = WindowState.Normal; 
    } 

Wo windowConfigureDatabase das neue Fenster ist, ich will öffnen. windowConfigureDatabase.Clear(); setzt nur alle Werte auf den Standardwert zurück - es gibt nicht viele, die zurückgesetzt werden müssen. Ich habe mich gefragt, ob dies der richtige Weg ist, um neue Fenster in WPF zu öffnen. Der andere Weg, an den ich dachte, war einfach ein neues Fenster bei jedem Klick zu erstellen (auf diese Weise muss ich die Werte nicht jedes Mal löschen ...), aber ich habe Angst, zu viel Speicher zuzuweisen, wenn ein Benutzer das öffnet Fenster und schließt es oft, da ich nicht ganz sicher bin, ob der Garbage Collector das Fenster beim OnClose-Ereignis aufruft.

Also im Grunde ist meine Frage - greift der Müllsammler meine Fenster auf, nachdem ich sie während des Schließens geschlossen habe? Wenn nicht, was wäre die richtige Art, den Speicher des Fensters manuell zu verwalten? Würde das Hinzufügen einer

windowConfigureDatabase = null

auf Closed/OnClosing Veranstaltung gut tun?

Antwort

1

hat der Garbage Collector meine Fenster holen, nachdem ich sie schließen während des Schließens/Geschlossene Veranstaltung?

Ja, wenn nicht erreichbar. Lesen Sie this für eine bessere Idee.

Würde das Hinzufügen eines

windowConfigureDatabase = null

auf Closed/OnClosing Veranstaltung gut tun?

Ja. Wenn Sie dies nicht tun, wird verhindert, dass das Fenster "Garbage Collected" wird, bis windowConfigureDatabase überschrieben wird oder das Objekt, das es enthält, gesammelt wird.

Der Speicher, der von einem Fenster verwendet wird, hängt von seinen Dimensionen ab und davon, wie viel Arbeitsspeicher zugewiesen wird, um das zu tun, was er tun muss. Im Allgemeinen brauchen Sie sich darüber keine Gedanken zu machen, es sei denn, Sie erstellen Tonnen von Fenstern (~ 30 +) und/oder große Datenmengen.

Der schnellste Weg zu vergeben ist, um vorne (idealerweise beim Start) zuzuordnen und wenn möglich wiederzuverwenden. Zum Glück mit Windows ist das relativ einfach. Die Idee ist, sich zu verstecken statt zu schließen und nur zu schließen, wenn es wirklich nicht mehr benötigt wird.

So:

// In each window class or as a base class: 
private bool isClosable = false; 

protected override void OnClosing(CancelEventArgs args) 
{ 
    // Prevent closing until allowed. 
    if (!isClosable) { 
     args.Cancel = true; 
     Hide(); 
    } 
    base.OnClosing(args); 
} 

// Call this when you want to destroy the window like normal. 
public void ForceClose() 
{ 
    isClosable = true; 
    Close(); 
} 
+0

Das ist ganz in der Nähe, was ich jetzt in meinem Code haben, mit Ausnahme der Dialogresult = false. Ich nehme an, Sie brauchen das nur, wenn Sie eine Schaltfläche haben, die eine Standard-Ja-> Beenden-Schaltfläche ist? –

+0

Die Einstellung von DialogResult in diesem Fall ist nur ein normaler Standard. Es ist nicht notwendig, es sei denn, Sie müssen schließen/ausblenden, um einen Cancel-Effekt zu haben. –

+0

Okay. Also bleibe ich dabei, aber jetzt muss ich eine bessere Möglichkeit finden, die Werte nach dem Schließen eines Fensters auf die Standardwerte zurückzusetzen, als eine separate Funktion für jede von ihnen zu machen ... –

Verwandte Themen