WPF i Silverlight – niby to samo a jednak mile świetlne od siebie. Przepisywanie aplikacji z jednej technologii do drugiej nawet jeśli autor piszący w tej pierwszej był świadomy ograniczeń, będzie drogą przez mękę. Jeśli nie był lub inne priorytety zaważyły, aby aplikacja WPFowa była rozwijana a później pomyśli się o SLu to jesteśmy w d… 🙂

Ostatnimi czasy dopadło mnie to szczęście, iż musiałem przekodować coś z 3 literek na dwie. Szczerze, to zaczynając cały proces średnio to widziałem, a teraz, choć efekt nie jest jeszcze finalny, nie jest nawet tak źle.

Poniżej lista, krótkie podsumowanie, tego na co trzeba uważać, lub jak sobie radzić z potencjalnymi problemami, których na naszej drodze będzie sporo…

Przydatne narzędzia i biblioteki:

  • XAML Spy – płatne, ale dobre narzędzie do podglądania tego co w XAPie siedzi. Dodatkowo potrafi sobie poradzić z WPFem oraz WP7&8. Musowo. Dzięki niemu będziemy w stanie zobaczyć jakie eventy latają pomiędzy naszymi kontrolkami oraz jakie wartości są ustawione na drzewie XAMLowym w tym także Attached Properties! Poza tym wiele wiele innych opcji – na pewno się przyda.
  • Silverlight Toolkit – choć trochę zasypuje dziurę wynikającą z braku jednej literki…
  • Blend SDK API – pozwala rozszerzyć ubogie triggery, które występują w SLu o nowe odmiany. W tej chwili do SL 5 jest dystrybuowany razem z Visual Studio 2013 Preview. Nie ma co pochylać się nad wersją 4 i od razu przejść do najnowszej.
  • Silverlight Drag&Drop Manager – implementuję technikę Drag & Drop kulejącą (w zasadzie można napisać nieistniejącą) w SL.
  • WriteableBitmapEx – przydatne rozszerzenia do klasy WriteableBitmap
  • SharpCompress – Zipy, Tary, Rary i podobne..czasem przydatne w zależności od projektu i wymagań
Błędy i inne irytujące błędy w SL, na które się można natknąć:
  • w SL wiele akcji kończy się wyjątkiem “Dialog must be user-initiated”. Jeśli natkniecie się na taki błąd oznacza to tyle, że dany ekran (SaveDialog, OpenFileDialog, etc.) muszą być pokazywane w reakcji na akcję użytkownika (np. kliknięcie). Ma to niby na celu ochronę przed wrogimi aplikacjami. Prowadzi to jednak do takich absurdalnych sytuacji, że nie da się wyświetlić okna wczytania pliku, sprawdzić jego rozmiaru a następnie wyświetlić okienka z prośbą o zwiększenie przestrzeni IsolatedStorage dla naszej aplikacji. Próba pokazania tego drugiego okna zawsze będzie kończyć się niepowodzeniem. O ile dobrze pamiętam ticket na Microsoft Connect wisi od 2010 roku.
  • Jeśli debugujecie to pułapki ustawiajcie już za OpenDialog – jeśli będziecie próbować debugować kod, który pokazuje okno – dostaniecie powyższy komunikat błędu.
  • Nie ma AdornerLayer :/. Potrzebujesz? Piszą własną…
  • Thumb jest Sealed :/
  • Nie ma IMultiValueConverter i MultiBindingu
  • Nie ma MultiDataTrigger
  • CanExecuteCommand nie odpala się automatycznie we wszystkich sytuacjach
  • “Połowa” kursorów myszki jest niedostępna
  • Slider jest niedorobiony :/
  • Nie ma ItemContainerStyleSelector
A co na plus Silverlightowi można zapisać? Debugging {Binding}! Mega przydatna rzecz. Już dawno temu pisał o tym Wojtek a na Channel9 jest krótkie video o tym:
 
Pewnie powyższa lista nie jest kompletne i pewni coś mi umknęło. Szczerze to w pewnym momencie straciłem rachubę notując rzeczy, których nie ma…no ale cóż w sumie nasza praca polega, na tym aby radzić sobie z problemami, choć chyba w tym przypadku trochę ich zbyt wiele narzuca sama technologia.
 
Chętnie bym pokazał porównanie obu wersji, ale niestety nie będę mógł tego zrobić z racji NDA.