WPF Elementhost
Nu börjar programmet bli klart för att betatestas av många fler personer. Todo-listan börjar krympa. Applikationen är alltså en Winforms applikation med vissa WPF-kontroller som integreras i WinForms med kontrollen elementhost.
Microsoft hävdar att denna kontroll är perfekt att använda för att stegvis migrera en winform applikation till WPF eftersom man kan migrera kontroll för kontroll, eller ett formulär i taget, genom att skapa wpf-kontroller som man "hostar" i elementhost.
Perfekt tänkte jag, den ska jag använda eftersom jag redan var klar med en stor del av gränssnittet och ville inte bygga om det jag redan gjort med Winforms, utan hellre fortsätta med WPF för det som inte är klart i programmet. Tyvärr har det visat sig att elementhost inte är helt ok, den läcker minne och uppträder segt vid resize händelser.
Jag hade en usercontroll som visade grundläggande statistik för en spelare. Detta var alltså en vanlig winform userkontroll från början som jag sedan migrerade till en WPF-kontroll.
Denna kontroll skapade jag en gång per användare i en panel så att det då visade fem sådana kontroller om det fanns fem användare i systemet. För att migrera detta skapade jag en WPF kontroll som ritade samma sak, och "hostade" den i en elementhost, som jag skapade en gång per användare i systemet.
Till en början var jag nöjd med denna lösning, det gick fort att skriva om koden till detta, det enda jag behövde göra i grundapplikationen var att lägga till en elementhost med en WPF-userkontroll till befintlig applikationslogik. (Förutom själva koden för WPF-kontrollen så klart.)
När jag sedan testade resize, olika antal kontroller (spelare), med mera, märkte jag hur applikationen blev segare och segare. Jag öppnade taskmanagern och ser att för varje resize ökade minnesanvändningen med ca 10MB, men den gick aldrig ner. Dessutom upplevde jag mycket flimmer när jag scrollade. Så, det var bara att ta tjuren vid hornen och göra som jag borde ha gjort från början, att skapa en userkontroll som dynamiskt hanterar antalet spelare, desutom blev det mycket snyggare också eftersom det finns fler möjligheter i WPF med expanders etc.
Nedan är en bild på en WPF-userkontroll som visas i en elementHost, där WPF-userkontrollen laddar antalet spelare och skapar layouten dynamiskt i code-behind.
Så en varning till alla som använder elementHost, var försiktig med att använda elementHost och tänk efter en gång extra innan du migrerar dina befintliga kontroller rakt av och om det är WPF eller Winforms som ska stå för det "dynamiska".
Labels: elementhost, statistik, WPF
