czwartek, 26 grudnia 2013

Zapis kontrolki do kafelka Live Tile

W bibliotece RadControls for Windows Phone znajduje się mechanizm do zrzucania kontrolki do kafelka Live Tile (przy użyciu LiveTileHelper). Niestety, ta operacja jest bardzo zawodna - często kafelek nie renderuje się prawidłowo (zwłaszcza gdy jest nieco bardziej skomplikowany), a i czas wykonywania pozostawia wiele do życzenia. Nie mam pojęcia jak to ich programiści zaimplementowali, ale postanowiłem wziąc sprawy w swoje ręce, by znaleźć lepsze rozwiązanie!

Kod


Oto mała metoda, która zapisze kontrolkę (która ma być użyta jako Live Tile), a następnie zwróci ścieżkę do pliku w Isolated Storage. Tą ścieżkę następnie musimy dodać do StandardTileData we właściwości BackgroundImage.

I to tyle - obrazkowy kafelek powinien pojawić się na ekranie głównym telefonu! Warto również potestować nazwę kafelka, bo mam wrażenie że raz na jakiś czas nie odświeża się na WP8, a więc można tak zmienić poniższy kod, aby nazwa pliku była generowana z GUID-em. Oczywiście wówczas należy kasować wszystkie nieużywane kafelki, żeby niepotrzebnie nie zużywać pamięci telefonu.

public static string SaveTileToJpeg(UIElement customTile, string filename = "CustomTile.jpg", int width = 336, int height = 336, int quality = 95)
        {
            string dir = "Shared/ShellContent";
            string filePath = dir + "/" + filename;

            customTile.UpdateLayout();
            customTile.Measure(new Size(width, height));
            customTile.UpdateLayout();
            customTile.Arrange(new Rect(0, 0, width, height));

            var bmp = new WriteableBitmap(width, height);
            bmp.Render(customTile, null);
            bmp.Invalidate();

            var myStore = IsolatedStorageFile.GetUserStoreForApplication();
            if (!myStore.DirectoryExists(dir))
            {
                myStore.CreateDirectory(dir);
            }

            using (IsolatedStorageFileStream myFileStream = myStore.CreateFile(filePath))
            {
                bmp.SaveJpeg(myFileStream, bmp.PixelWidth, bmp.PixelHeight, 0, quality);
                myFileStream.Close();
            }

            return "isostore:" + filePath;
        }

A oto przykładowy efekt:

Pomocne linki:

Brak komentarzy: