2017-08-18 4 views
0

Ich versuche, die AvalonDock-Umgebung in WPF zu lernen. Ich habe einen verankerbaren Bereich, der eine Baumansicht enthält, die eine Liste von Objekten anzeigt (enthält grundsätzlich einen Namen und einen Wert).Speichern AvalonDock-Layout mit dynamischem Inhalt

Ich habe auch einige Dokumentbereiche, die ein UserControl hosten. Ich kann ein Element aus der Strukturansicht in ein Dokument (UserControl, das im Grunde ein WrapPanel ist) ziehen und es dann ablegen, es fügt einen zweiten Benutzersteuerungs-Typ hinzu (dieses Steuerelement hat einen an 'name' gebundenen Textblock und ein an 'value' gebundenes Textfeld) ') zu meiner Kontrolle durch das Dokument gehostet.

Jetzt - ich möchte in der Lage sein, dieses Layout zu speichern - mit dem dynamischen Inhalt, der durch Ziehen/Ablegen erzeugt wird.

Ist das möglich? Wenn ich den XmlLayoutSerializer verwende, sehe ich, dass das erzeugte XAML meine Dokumente und Verankerungen hat, aber keines dieser Elemente hat irgendeinen Inhalt.

Soll ich stattdessen eine Sammlung der Objekte speichern (d. H. Die ObservableCollection, an die ich gebunden bin) und die Sammlung initialisieren, wenn ich die Ansicht "wiederherstellen" möchte?

Die Absicht besteht darin, eine Ansicht zu haben, die Endbenutzer ändern können, um die gewünschten Daten anzuzeigen (aus der Strukturansicht) und das Layout so anzuordnen, wie sie es für richtig halten.

Danke für alle Hinweise

Antwort

0

ein Artikel über Codeproject Es gibt die eine Lösung beschreibt: https://www.codeproject.com/articles/719143/avalondock-tutorial-part-load-save-layout

Sie können auch einen Blick auf die Gemini-Projekt, das eine wesentlich flexiblere Lösung hat: https://github.com/tgjones/gemini/ Das wichtige Zeug befindet sich im Gemini/Framework-Verzeichnis.

Es handelt sich um eine reine MVVM-Lösung, die alle Dokumente und Layoutelemente im Haupt/Shell-Viewmodel und in den Databinds speichert. Beim Speichern des Layouts wird jedes Viewmodel aufgefordert, seinen Status zu speichern, und der Status DockingManager wird zuletzt beibehalten. Beim Laden des Layouts wird zuerst der gesamte Status gelesen, und die Ansichtsmodelle werden im Ereignis LayoutSerializationCallback des AvalonDocks XmlLayoutSerializer neu erstellt. Dies ist eine nette und saubere Herangehensweise, aber (AFAIK) kann es nicht mit einer Situation umgehen, wenn die Steuerelemente rein in XAML erstellt und mit dem Rest der Anwendung unter Verwendung einer Art von Nachrichtenübertragung verbunden sind (z. B. Prism EventAggregator).

diese Art von Problem zu lösen, werden Sie eine Hilfe aus der Sicht müssen die DockingManager Gastgeber, fragen sie für eine Liste von LayoutAnchorables und LayoutDocuments und speichern/ihre Zustände laden ähnlichen Mechanismus verwenden. Es ist nicht so elegant und pure MVVM wie die ursprüngliche Lösung, aber ich fand es flexibler. Sie können alles in ein paar Schnittstellen und Erweiterungsmethoden einbinden.

Ich habe so etwas für mein Projekt gemacht und es funktioniert super. Könnte es eines Tages auf GitHub setzen.

Verwandte Themen