Tabcontrol und MVVM



  • 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 nachdenken

    Jemand 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 TreeView 😃

    Ein 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.


  • Administrator

    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

    http://www.amazon.de/gp/product/3836215381/ref=s9_simh_bw_p14_d0_g14_i2?pf_rd_m=A3JWKAKR8XB7XF&pf_rd_s=center-1&pf_rd_r=00G1PAHE6E8JA37RCPZH&pf_rd_t=101&pf_rd_p=223262327&pf_rd_i=288100

    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?


  • Administrator

    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.aspx

    Grüssli



  • Noch ne Frage zu HiraricalDataTemplates. Habe bei Codeproject einiges Dazu gefunden dass mir schon mal viel geholfen hat.

    Hier mal ein kleiner Ausschnitt was ich gemacht habe

    <TreeView.Resources>
        <HierarchicalDataTemplate 
           DataType="{x:Type local:ViewModel1}" 
           ItemsSource="{Binding Liste}">
           <!-- Controlls mit Binding zu den Daten-->
        </HierarchicalDataTemplate>
    
        <HierarchicalDataTemplate 
           DataType="{x:Type local:ViewModel2}" 
           ItemsSource="{Binding Liste}">
           <!-- Controlls mit Binding zu den Daten-->
        </HierarchicalDataTemplate>
    
        <DataTemplate 
           DataType="{x:Type local:ViewModel3}">
           <!-- Controlls mit Binding zu den Daten-->
        </DataTemplate>
     </TreeView.Resources>
    

    So jetzt habe ich den Baum aufgebaut und das Aussehen der einzelnen Knoten festgelegt. Nun habe ich aber immer noch ein Baum zum aufklappen. Und die Elemente sind nicht grafisch ineinander verschachtelt.

    Was muss ich dazu machen?


Anmelden zum Antworten