Dziś po małej przerwie mała podpowiedź dla osób zajmujących się Windows Phone 7.
Jak wiadomo (lub też nie ) platformy, przy pomocy których możemy pisać własne aplikacje na WP7 to Silverlight 4 Windows Phone (nie piszę samego Silverlight, bo są tu pewne różnice w stosunku do pełnej wersji) oraz XNA 4.0. Nie oznacza to jednak, że musimy zamykać się tylko w jednym ze światów. Istnieje możliwość korzystania w jednym projekcie z przestrzeni nazw, klas i funkcjonalności dostępnych w obu tych technologiach. Zapewne najczęstsze “wymieszanie” technologii następuje gdy tworzymy w Silverlight. Dlaczego? Między innymi dlatego, że XNA oferuje nam wiele funkcjonalności multimedialnych takich jak odtwarzanie dźwięków, nagrywanie przy pomocy mikrofonu, MediaPlayera, ale również udostępnia rozpoznawanie gestów przy pomocy TouchPanel (tak – wiem, że Silverlight mamy Silverlight Control Toolkit i GestureListener, ale tak naprawdę jest on nakładką na TouchPanel z XNA ).
Tak czy inaczej, może okazać się, że w momencie gdy dodamy do projektu referencję do klas z XNA i będziemy korzystać z zawartych tam obiektów może się okazać, że otrzymujemy błąd widoczny na screenie poniżej, czyli InvalidOperationException, FrameworkDispatcher.Update has not been called.
Oznacza on tyle, że korzystamy z elementów, które wymagają wywołania metody “odświeżenia stanu XNA” . Aby to zrobić wystarczy użyć takiego oto fragmentu kodu w konstruktorze strony SL:
1 2 3 4 | DispatcherTimer dt = new DispatcherTimer(); dt.Interval = TimeSpan.FromMilliseconds(33); dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } }; dt.Start(); |
W tym momencie przy uruchomieniu aplikacji błąd ten się nie pojawi. Warto jeszcze zauważyć, że nie ma sensu ustawiać częstszego odświeżania (czyli interwału dla DispatcherTimer), gdyż platforma Windows Phone 7 wspiera maksymalnie 30 klatek na sekundę (co daje odświeżenie do 33 milisekundy), w przeciwieństwie do pełnego XNA, które wspiara standardowo 60 fps.