Tabcontrol und MVVM
-
Mach mal die UserControls leer bis auf eine TextBlock oder so.
Ist es dann immer noch langsam?Ich vermute das liegt an den Bindings innerhalb der UserControls selber, diese werden erst ausgewertet sobald du das entsprechende Tab ausgewählt hast. (Beim ersten der direkt sichtbar ist (sofern so eingestellt) lädt es sobald das Fenster öffnet, dadurch merkst du sowas vermutlich nicht.)
-
Ja wenn ich nur nen Textblock rein mache geht es schnell.
Was kann ich dagegen unternehmen. Und wieso geht es nur so langsam wenn ich es über DataTemplate mache?
-
Zeitpuntk des Ladens.
Wenn du es direkt rein packs (Statische Elemente statt Liste) dann wird alles beim Start des Fensters geladen (dadurch merkst du es nicht).
Ansonsten wird ein TabItem erst vollständig geladen wenn du es auswählst (Fang dir mal das Loaded Event des UserControls in dessen Codebehind rein, dann merkst du wann das rein kommt).Dagegen machen? Standard Performance beachten.
Erster Anfang wäre die Xaml selber zu überarbeiten,
- unnötige Controls raus schmeißen (Grid als einzelnes Element im Grid usw.)
- Teure Controls sofern möglich gegen günstige austauschen (Das Grid ist sehr teuer, ein StackPanel oder DockPanel ist günstiger)
- Farbverläufe, Animationen usw in die Resourcen auslagern (dann kann es gefreezed werden)
- Wenn Daten im Model lazy geladen werden, dann eventuell über ein PriorityBinding nachdenkenJemand der sich auskennt müsste sich mal die echten UserControls anschauen und ggf optimieren.
Kommentier doch mal Sachen ein und aus, eventuell findest du einen Übeltäter.
-
Dagegen machen? Standard Performance beachten.
Versteh ich nicht was du mir damit sagen willst.
-
Na das man die Standardmittel ausnutzt um die Performance zu verbessern. http://msdn.microsoft.com/en-us/library/aa970683.aspx
Ein paar Punke habe ich ja aufgeführt die mir als erstes einfallen.
=> Da gibt aber kein Allheilmittel. Was am besten funktioniert weiß man nur wenn man den echten Code kennt.
//Edit
Ich hatte auch schon mehrere TabControls derart in Benutzung, aber noch nie Performanceprobleme. Man muss nun forschen woher die kommen bzw, wie ich oben schon sagte, wer der Übeltäter ist.
-
Es liegt denke ich nicht am Tabcontrol sondern am Inhalt des ersten Tabs
Das erste Tab beinhaltet ein UserControl.
Dieses UserControl hat ein ItemsControl die eine Liste aus weiteren Usercontrols ist. Dieses UserControl beinhaltet wieder ein Itemscontrol mit Usercontrols. Und das ganze dann noch einmal. Das letzte ist dann nur noch eine Combobox.
Ich habe sozusagen eine 3 Fache Rekursion.
Vieleicht ein Beispiel: Oberste Ebene ist ein Haus (UserControl_1). Dies beinhaltet eine Liste von Zimmern (UserControl_2). Jedes Zimmer beinhaltet eine Liste von Bereichen (Usercontrol_3). Jeder Bereich beinhaltet eine Liste von Stühlen (UserControl_4).
Besonderheit alles ist symetrisch. Also jedes Zimmer besteht aus der selben Anzahl von Bereichen, jeder Bereich hat die selbe Anzahl von Stühlen. Letzendlich kann man dann für jeden Stuhl über die Combobox eine individuele Farbe geben.
Die Usercontrols bestehen fast ausschliesslich aus Itemcontrols. Maximal noch ein Label oder Button dazu. Panel ist dann immer ein Stackpanel.
Die Rekursion macht hier das ganze langsam. Habe ich z.B. 12 Zimmer. Jedes Zimmer hat 2 Bereiche und jeder Bereich 4 Stühle. Sind dann insgesammt 96 Stühle dementsprechend 96 Comboboxen. Stellt die Combobox nur 3 Farben zur Auswahl wird die Applikation so langsam, dass wenn das Programm aus VS gestartet wird, die UserControls teilewiese gar nicht vollständig angezeigt werden. Erst nach einem Tabwechsel.
Aussehen ist komplett in Resourcen ausgelagert. Die Geschwindigkeit erhöht sich in der Relation wie ich die untergeordneten Usercontrols wegnehme. Also es gibt nicht den "einen" Übeltäter.
-
(Von den Inhalt der Tabs habe ich doch geredet)
Die Massen von UserControls sind die Übeltäter.
Das Control vom Typen "UserControl" ist recht teuer.
Warum sind es überhaupt UserControls wenn es so wenig beinhaltet?
Geht doch alles über DataTemplates. Und so wie du es schilderst klingt das gar nach einer TreeViewEin UserControl nur für eine ComboBox ist schlichtweg gesagt Blödsinn.
Genauso ein UserControl das nur eine Liste von weiteren Controls hält, auch quatsch, pack doch die Liste direkt rein.Du solltest deine Exzessive Benutzung der UserControls überdenken.
-
Nun gut dachte dadurch wird das ganze überischtlicher. Ist ja auch so. Aber wenn das Control halt sehr teuer ist. Dann mach ichs über Datatemplates.
Treeview ist denke ich nicht das was ich suche. Möchte das ganze grafisch darstellen und nicht einfach nur als Liste.
Also Haus als Border. Raum wieder als Border der im Border des Hauses gezeichnet wird usw.
-
Eine TreeView kann das auch, musst nur das Style umbauen und das auf und zu klappen unterbinden.
Schon hast du die Möglichkeit des HiraricalDataTemplates und musst dich nicht mit UserControls rum prügeln.
-
@Offtopic.
Ich find ja der David sollte ruhig mal ein Artikel über MVVM schreiben oder auf seiner Seite nen Tutorial machen. Finde das das nen sehr wichtiges Thema ist, und es gibt wirklich kaum gute Tutorials im Netz. Da ich ja weiß das er gut erklären kann, fänd ich das echt mal Cool
-
Wie man MVVM "richtig" macht ist im Web recht kontrovers, und ich will meine herangehensweise (auch wenn sie sich immer mit den anderen deckt) nicht als die absolut richtige verkaufen.
Tutorials wirds schon genug geben ^^Firefighter schrieb:
Da ich ja weiß das er gut erklären kann
Kommt auf meine Stimmung an, manchmal bin ich einfach nur ein Kotzbrocken ^^
-
David W schrieb:
Wie man MVVM "richtig" macht ist im Web recht kontrovers, und ich will meine herangehensweise (auch wenn sie sich immer mit den anderen deckt) nicht als die absolut richtige verkaufen.
Tutorials wirds schon genug geben ^^Jedoch ist deine herangehensweise hier im Forum die einzig bekannte
Von der man auf jeden Fall immer was lernt wenn es Probleme gibt
David W schrieb:
Kommt auf meine Stimmung an, manchmal bin ich einfach nur ein Kotzbrocken ^^
Joa jeder hat mal seine schlechten Tage.
-
David W schrieb:
Tutorials wirds schon genug geben ^^
Viele allerdings auf Englisch. Aber was man allenfalls mal tun könnte, sind entsprechende Links zu sammeln und in die FAQ zu verschieben. MVVM war bei mir eines der grössten Probleme bei WPF, allerdings vor allem deswegen weil mein WPF Buch kein einziges Wörtchen darüber verloren hat. Nicht mal MVVM wurde erwähnt
Grüssli
-
Isses bei MVC nicht auch so?
Kann mich nicht erinnern das dies mal in ein Buch erwähnt wurde ^^Anyway, ich denk nicht das meine Website dafür zu gebrauchen ist, sie ist zum einen auch nur auf Englisch
und zudem geht es da nur um meine libs, nichts generelles.
Firefighter, du hast doch ne website, stell doch selber eins Online ^^ Auf deutsch.
Ich könnte eins schreiben wenn ich eventuell mal ein real live szenario hätte wo man es deutlicher sieht, die meisten Tutorials die ich kenne behandeln nur die Grundzüge, für Detailfragen muss man wieder irgendwo anklopfen. Daher wäre ein Tutorial gut wo alles mögliche mal aufgezeigt wird.Spontan würde mir einfallen.
- Ne TreeView.
- Ein Settings Fenster mit diversen Unterseiten.
- Ein TabControl mit diversen Seiten.
- Unterfenster, Systemdialoge oder MessageBoxen, how to use.
- Elegantes Testen von ViewModels mit Mocks und/oder Extract and Override.
-
Ja wäre ne gute Idee David, aber ich würde das gerne in Zusammenarbeit mit dir machen, einfach weil mehr Erfahrung hast, kannst du mich nochmal in ICQ adden(227291261)? Das wir uns mal zusammen setzen und mal so Sachen zusammentragen die dir einfallen und die am besten mit Codebeispielen ausschmücken oder so? Mir liegt das Thema nämlich auch am Herzen und ich würde da gerne tiefer einsteigen.
-
Als Info für alle:
So schnell wird es zu keinem Deutschen Tutorial meinerseits kommen, Firefighter und Ich, wir haben derzeit einfach zu wenig Zeit.
Er wegen sein Studium, und ich weil sich beruflich bei mir so einiges verändert und ich nicht weiß wie ich Zeit haben werde.
-
Für alle die nicht auf ein Tutorial in Deutsch warten können / wollen; in den folgenden Büchern wird MVVM auch abgehandelt:
http://www.amazon.de/gp/product/product-description/3826659368
Der Autor vom ersten Link(Norbert Eder) hatte das Thema auch mal in seinem Blog abgehandelt, finde nur leider den Link dazu nicht mehr.
-
Das Bste WPF Buch was man bekommen kann ist das von Adam Nathan
One Hundred One Windows Phone 7 Apps | ISBN: 0672331195
(Ob MVVM dabei ist weiß ich allerdings nicht ^^)
-
So jetzt melde ich mich auch mal wieder. An den Feiertagen arbeite ich nicht :-).
In dem Buch von Thomas Claudius Huber ist das MVVM auch nur angeschnnitten.
Aber nochmals zu meinem Thema. Wenn ich also das ganze mit einem TreeView mache kann ich für jede Ebene ein eigenes DataTemplate anlegen und das eventuell auch jedes für sich in einer Datei?
-
David W schrieb:
(Ob MVVM dabei ist weiß ich allerdings nicht ^^)
Zumindest in einem Vorgänger davon, wurde es nicht mal am Rande erwähnt. Das Buch ist aber trotzdem recht gut, man muss sich einfach unbedingt noch Informationen zu MVVM beschaffen. Wie z.B. von da:
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
http://msdn.microsoft.com/en-us/library/gg430857.aspx
http://msdn.microsoft.com/en-us/library/gg430869.aspxGrüssli