2012-03-28 14 views
0

Ich arbeite an einer WPF-Anwendung, die eine Wrapper-Benutzeroberfläche enthält, die eigentlich die MainWindow.xaml ist, und der darin enthaltene Inhalt (ContentPresenter) wird jedes Mal geändert Benutzer wählt, um zu einem anderen Abschnitt der Anwendung zu wechseln.Erstellen einer statischen Ansicht in WPF, die nicht jedes Mal initialisiert wird

Wenn der Benutzer zum Hauptinhalt zurückkehrt, möchte ich, dass die Anwendung sie nicht jedes Mal initialisiert, sondern irgendwie im Speicher speichert und wiederherstellt, wenn der Benutzer auf die Schaltfläche "Home" klickt.

Im aktuellen Status wird die Home-Ansicht immer wieder initialisiert, wenn Sie zum Abschnitt "Home" zurückkehren, wodurch die Anwendung etwas langsam wird. Meine Frage ist: Gibt es eine Möglichkeit, diese Benutzerkontrolle irgendwie im Speicher zu halten, so dass ich sie schnell wiederherstellen könnte?

Danke!

+1

Es ist nicht einfach, genau das zu tun, was Sie zu tun versuchen, aber könnten Sie den Inhalt "home" nicht in einem separaten Steuerelement speichern und einfach ausblenden? –

+0

Der Inhalt, der entsprechend den vom Benutzer gedrückten Schaltflächen ersetzt wird, ist in MainWindow.xaml an einen 'ContentPresenter' gebunden. Wenn der Benutzer auf eine andere Workflow-Schaltfläche klickt, wird der Inhalt durch den Inhalt ersetzt, der vom Benutzer angeklickt wurde. aber ich möchte, dass der Inhalt "Home" sich versteckt und nicht jedes Mal, wenn der Benutzer zum "Home" -Bildschirm zurückkehrt, entsorgt und neu aufgebaut wird. Wie kann ich es verbergen, ohne es zu entsorgen, wenn ich verbindlich bin? –

+0

Sie können das UserControl nicht einfach in einer privaten Variable speichern? – Paparazzi

Antwort

0

Schließlich habe ich beschlossen, die ContentControl in eine ItemsControl zu verschieben und dann alle Inhaltssteuerelemente mit Ausnahme der aktiven ausblenden.

Hier ist ein Ausschnitt aus meinem Code:

<ItemsControl ItemsSource="{Binding ViewModels}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Grid /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ContentControl Visibility="{Binding Visibility}" Content="{Binding ViewModel}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

In meinem Viewmodel ich den eigentlichen Inhalt und eine andere Visibility Eigenschaft, die auf false gesetzt wird, wenn der Inhalt nicht die aktuelle ist und true wenn es ist.

Danke an alle Helfer!

+0

Wie oben erwähnt, habe ich dieses Problem mit dieser Problemumgehung behoben. Danke an alle Helfer! :) –

1

Verstecken ist natürlich eine Option wie @Matt vorgeschlagen. Eine andere Möglichkeit ist die Erforschung der wunderbaren Welt der Frameworks (Prism, Caliburn, Caliburn, ...)

Diese liefern eine große Hilfe bei der Verwaltung von WPF-Anwendungen.

Im Wesentlichen müssen Sie einen Verweis auf das ViewModel beibehalten, eine Sammlung im mainviewModel oder mainview, die die geladenen ViewModels verfolgt.