Jakub Florczyk - Blog o programowaniu .NET

Programista praktyczny

Tag: Silverlight

ID aplikacji Windows Phone

Jakiś czas temu znalazłem ciekawy trick na uzyskanie ID aplikacji Windows Phone.

Całość sprowadza się do odczytania pliku WMAppManifest.xml:

using System;
using System.Xml.Linq;

namespace PhoneApp.ApplicationId
{
    public static class ApplicationProperties
    {
        public static Guid GetId()
        {
            Guid applicationId = Guid.Empty;

            var productId = XDocument.Load("WMAppManifest.xml").Root.Element("App").Attribute("ProductID");

            if (productId != null && !string.IsNullOrEmpty(productId.Value))
                Guid.TryParse(productId.Value, out applicationId);

            return applicationId;
        }
    }
}

Po czym, wystarczy odpalić metodę GetId aby uzyskać ID aplikacji w dowolnym miejscu kodu:

using System;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;

namespace PhoneApp.ApplicationId
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void ButtonShowId_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(ApplicationProperties.GetId().ToString(), "My id is:", MessageBoxButton.OK);
        }

        private void ButtonShare_Click(object sender, RoutedEventArgs e)
        {
            ShareLinkTask shareLinkTask = new ShareLinkTask();
            shareLinkTask.Title = "Check this app!";
            shareLinkTask.LinkUri = new Uri(string.Format("http://www.windowsphone.com/s?appid={0}", ApplicationProperties.GetId()), UriKind.Absolute);
            shareLinkTask.Show();
        }
    }
}

Przydatny kawałek kodu, który uchroni nas przed hard kodowaniem ID i podwójną publikacją aby uzyskać ten numer a potem aby finalnie opublikować aplikację.

Na warsztatach Nokia dla developerów Windows Phone najlepsza była… kawa

Dzisiaj pofatygowałem swoje szanowne cztery litery na warsztaty Nokia dla developerów Windows Phone. Trochę z chęci do otarcia się o świat wielkich idei a trochę z powodu znajomego, który mnie podpuszczał, że pewnie mam za duże ego aby się na takie warsztaty wybrać.

Miejsce warsztatów, to nowoczesny budynek Auditorium Maximum Uniwersytetu Jagielońskiego. Jak wszedłem do budynku to moje IQ wzrosło o 10 punktów i osiągnęło nigdy wcześniej nie osiągnięty pułap 20 punktów. Trochę wcześniej kluczyłem uliczkami próbując zaparkować swoją furmankę w jakby na to nie patrzeć centrum Krakowa. A każdy kto próbował tego dokonać w poniedziałkowy poranek wie, że bardziej prawdopodobne jest spotkanie Małopolanin, który wychodzi “na dwór”.

Zapowiadało się nieźle, przemiła hostessa z Allegro, która próbowała mnie namówić na staż w dziale developerskim Windows Phone. Na co pewnie bym się zgodził jakby spalili dotychczasową aplikację na WP (wraz z jej autorem).
Przestronna sala z kontaktami! Z oszołomienia musiałem się uszczypnąć, bo na MTS gniazdka dostępne są dla najszybszych lemingów a tu był ich nadmiar i to przy stolikach!

Ale po tym wstępie było tylko gorzej. Nie dość, że Nokia jakoś nie bardzo miała zamiar uzupełnić mój uszczuplony zasób długopisów i notatników z własnym logiem; to nie dawali nawet bajeranckich smyczy ani koszulek! Oburzony i zły usiadłem na losowo wybranym miejscu i rozpocząłem przysłuchiwanie się co mają do zaprezentowania prowadzący. Mniemałem, że skoro nie ma gadżetów to może poziom mnie oszołomi. Ale tak się nie stało…

Nie mam pretensji do prowadzących. Bo jednak w dwójkę trudno jest ogarnąć taką ilość materiału i przedstawić ją w kilka godzin. Ale merytorycznie są to warsztaty dla początkujących. Jeśli nie wiesz nic; to idź – wypijesz dobrą kawę i zjesz dobre ciastko. Ale jeśli już coś wiesz to umrzesz z nudów.

Nokia powinna uczyć się od Microsoft:

  • ilość hostess powinna być równa lub większa niż przekątną statystycznego notebooka na sali. My rzadko obcujemy z kobietami (pomijając te w jpg) i takie, które na nasz widok nie uciekają są dla przeciętnego developera ciekawym obiektem przemyśleń i analiz prowadzonych podczas nudnego wykładu.
  • orężem każdego inżyniera jest długopis i notatnik. Na każdej konferencji trzeba ich rozdawać aż nadto a my potem się nimi pieczołowicie opiekujemy nie oddając ich nawet dzieciom do malowania świeżo pomalowanych ścian.
  • smycze przyjmujemy w każdej ilości. Wieszając na nich klucz od naszych komórek w suterenach i od składzików na węgiel.
  • foldery, płyty CD, kolorowe katalogi. I tak je później wywalimy do kosza. Ale Pełna reklamówka PR’u wskazuje na udaną konferencję. A nasza żona nie podejrzewa nas o wypad do sąsiadki ;-)
  • więcej prowadzących z naciskiem na praktyków, którzy zjedli na temacie zęby. To podstawa udanego wykładu, bo nawet jak nie potrafią prowadzić takich wykładów, to można się od nich czegoś nauczyć od strony praktycznej a nie marketingowego paplania.

Nie ukrywam, że po cichu liczyłem na dar z nieba w postaci jakieś ładnej nowej Lumii; albo chociaż jakiś kupon zniżkowy! Przecież to nokia! Rzucają tymi słuchawkami na prawo i lewo w każdym konkursie, nie zbiednieliby gdyby developerzy dostali kilka setek nowiutkich słuchaweczek. Co ciekawe, ludzi z telefonami WP było stosunkowo mało. Więcej androidów a nawet kilku agentów z Cupertino posiadających o zgrozo iPhone’y.

Podsumowując było miło, ale spodziewałem się czegoś więcej. Tak się chyba nie zdobywa developerów. A ja na miejscu programisty, który dopiero bada rynek, nie przekonałbym się do platformy. Pomijam już fakt, że nie było ani słowa o narzędziach do promocji aplikacji pod brandingiem Nokii. A sama monetyzacja była potraktowana po macoszemu; a to przecież pieniądze mogą przekonać dopiero rozpoczynających przygodę do spróbowania swoich sił.

PS: Lunch także był niezły :)

Syncfusion Metro Studio

Jednym z problemów tworzenia interfejsów użytkownika od początku istnienia platformy Windows Phone było odszukanie (ewentualnie narysowanie) odpowiednich ikon zgodnych z zaleceniami Mango.

Choć wielu grafików już przygotowało własne zestawy ikon, to często dostarczany przez nich format albo rozmiar wymuszał edycję w Gimpie albo innym programie graficzny.

Wydaje się jednak iż koniec problemów dzięki oprogramowaniu od Syncfusion. Program nazywa się Syncfusion Metro Studio i zawiera nieprzebrane ilości ikon, które można wykorzystywać w aplikacjach. Każdą ikonę można wygenerować w kilku formatach, rozmiarach i dowolnej kolorystyce. Polecam bo to jedno z bardziej przydatnych narzędzi jakie ostatnio znalazłem w sieci.

Windows Phone Design Mistakes and How to Avoid them

David Crawford, User Experience Consultant w Microsoft opowiada o błędach popełnianych przy projektowaniu aplikacji dla Windows Phone. Polecam, bo to jeden z niewielu filmów o projektowaniu, przy którym nie zaśniecie; rzeczowy i na temat, bez zbędnego lania wody.

Użyteczne rozszerzenia 4/n!

Konwersja koloru “z” oraz “do” Int32 oraz konwersja z zapisu szesnastkowego.

Dwa pierwsze rozszerzenia są przydatne przy konwersji kolorów z WriteableBitmap.

// metody
public static Color ToColor(this int value)
{
    return new Color()
    {
        A = (byte)(value >> 24),
        R = (byte)(value >> 16),
        G = (byte)(value >> 8),
        B = (byte)(value)
    };
}

public static int ToInt32(this Color c)
{
    return (int)(c.A << 24) + (int)(c.R << 16) + (int)(c.G <<8) + (int)c.B;
}

public static Color ToColor(this uint argb)
{
    return Color.FromArgb(
        (byte)((argb & 0xff000000) >> 24),
        (byte)((argb & 0xff0000) >> 16),
        (byte)((argb & 0xff00) >> 8),
        (byte)(argb & 0xff));
}

// sposoby użycia
Colors.Black.ToInt32();
255.ToColor();
0xFF339933.ToColor();

Użyteczne rozszerzenia 3/n!

Uzupełnienie rozszerzenia z części pierwszej dotyczącego nawigacji w Windows Phone.

Nawigowanie do typów w Windows Phone z parametrami:

// metoda
public static bool Navigate<T>(this NavigationService navigationService, string query) where T : PhoneApplicationPage
{
    return navigationService.Navigate(new Uri(String.Format("/{0}.xaml{1}", typeof(T).Name, query), UriKind.Relative));
}

// sposób użycia
NavigationService.Navigate<CommentAddPage>("?Id=" + comment.Id + "&Author=" + HttpUtility.UrlEncode(comment.Author));

31 Weeks of Windows Phone Metro Design

Arturo Toledo na swoim blogu kilka tygodni temu rozpoczął serię artykułów o projektowaniu interfejsów dla Metro na Windows Phone. Polecam każdemu kto nawet w najmniejszym stopniu bierze udział w projektowaniu / wykonywaniu aplikacji na Windows Phone. Arturo bardzo dokładnie i wnikliwie przedstawia wszystkie aspekty projektowania i tworzenia interfejsów od podstaw ideowych, poprzez wybór odpowiednich typów aż po konwersje z istniejących nośników.

Użyteczne rozszerzenia 2/n!

W dzisiejszej części proste przełączanie widoczności UIElement w Silverlight:

// metoda
public static void ToggleVisibility(this UIElement uie)
{
    uie.Visibility = (uie.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible);
}

// sposób użycia
Button.ToggleVisibility();

Użyteczne rozszerzenia 1/n!

Od kiedy Microsoft wprowadził rozszerzenia (ang. extensions) do platformy .NET jestem ich wielkim fanem. Dlatego raz po raz wrzucę jakiś użyteczne rozszerzenie, które może się okazać przydatne.

W dzisiejszej części rozwiązanie bolączki nawigowania do stron w Windows Phone:

NavigationService.Navigate(new Uri("/ProductPage.xaml", UriKind.Relative));

Zawsze mnie to kuło w oczy ze względu na string w kodzie, których nie lubię. Oczywiście można definiować stałe i tym podobne cuda wianki. Albo użyć poniższego rozszerzenia:

// metoda
public static bool Navigate<T>(this NavigationService navigationService) where T : PhoneApplicationPage
{
    return navigationService.Navigate(new Uri(String.Format("/{0}.xaml", typeof(T).Name), UriKind.Relative));
}  

// sposób użycia
NavigationService.Navigate<ProductPage>();

Niestandardowe znaki w kontrolce WebBrowser

Używając kontrolki WebBrowser na telefonie Windows Phone mogliście się spotkać z błędnym kodowaniem znaków w trakcie używania metody NavigateToString. Podczas standardowego nawigowania przy użyciu metody Navigate do pliku lokalnego albo zewnętrznego wszystko działa poprawnie. Natomiast użycie metody NavigateToString powoduje dziwną interpretację znaków:

Nie pomaga ustawianie content-type ani języka w kodzie strony. Jednak rozwiązanie jest banalnie proste i sprowadza się do konwersji znaków na znaki specjalne:

private static string ConvertExtendedASCII(string html)
{
    string retVal = "";
    char[] s = html.ToCharArray();

    foreach (char c in s)
    {
        if (Convert.ToInt32(c) > 127)
            retVal += "&#" + Convert.ToInt32(c) + ";";
        else
            retVal += c;
    }

    return retVal;
}

// użycie
WebBrowser.NavigateToString(ConvertExtendedASCII(html));

Co w wyniku daje nam poprawnie wyświetlane teksty:

Metoda jest bardzo użyteczna i zalecam stosowanie jej nawet przy danych z serwisów angielskojęzycznych. Ponieważ zawsze może się zdarzyć sytuacja w której edytor wstawia znaki z zakresu > 127.