Codzienne praca z platformą Windows Phone przynosi bardzo wiele niemiłych niespodzianek. Bardzo często można spotkać się z sytuacją, że wiele rzeczy jest przemilczanych w dokumentacji i programista musi sam odkrywać jak coś działa.
Aktualizacja Mango dla Windows Phone wprowadziła nową wersję Silverlight na platformę. Ulepszenie to dodało możliwość wykorzystania StringFormat w dowiązaniach danych w pliku XAML. Użycie tej dodatkowej opcji jest bardzo proste:
<TextBox Text="{Binding Path=Value, StringFormat=Currency: {0:c}}"/>
Po wykonaniu tej linijki powinniśmy zobaczyć liczbę sformatowaną jako waluta. Wynik jaki można zaobserwować po uruchomieniu tego kodu nie do końca odpowiada temu czego się spodziewaliśmy. Owszem nasza liczba sformatowana jest jako waluta, ale nazwa waluty i format liczby jest niewrażliwy na zmianę ustawień regionalnych systemu.
Prześledźmy ten problem dokładniej. W tym celu zostaną wykonane dodatkowe linijki kodu:
<StackPanel> <TextBox Text="{Binding Culture, StringFormat=Culture: {0}}"/> <TextBox Text="{Binding UICulture, StringFormat=UICulture: {0}}"/> <TextBox Text="{Binding Path=Value, StringFormat=Currency: {0:c}}"/> <TextBox Text="{Binding CurrentTime, StringFormat=DateTime: {0:G}}"/> </StackPanel>
Oraz własności :
public string Culture { get { return Thread.CurrentThread.CurrentCulture.ToString(); } } public string UICulture { get { return Thread.CurrentThread.CurrentUICulture.ToString(); } } public double Value { get { return 12345.67; } } public DateTime CurrentTime { get { return DateTime.Now; } }
I teraz najciekawsze wynik działania. Po uruchomieniu emulatora, ustawienia wyświetlanego języka oraz ustawienia regionalne wskazują na język angielski (kraj Stany Zjednoczone). Po uruchomieniu programu zobaczymy następujący wynik: Do tego momentu wszystko jest w porządku. Zmieńmy teraz ustawienia tak, aby język i region był związany z Polską. Ku zaskoczeniu wynik odbiega od naszych oczekiwań:
Z jednej strony nasza aplikacja poprawnie wykryła zmianę ustawień językowych. Wątek główny aplikacji, jak również wątek UI poprawnie wskazują na to, że aplikacja powinna korzystać z polskich formatowań. Natomiast zarówno pole wyświetlające informacje o walucie, jak również o czasie nie respektuje tych ustawień.
Naprawa tego błędu sprowadza się do dodania jednej linijki do konstruktora widoku:
this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);
Po ponownym uruchomieniu programu uzyskamy oczekiwany wynik.
Pewien niesmak jednak pozostaje. Myśląc o nowych aplikacjach chciałbym się skupić na ich tworzeniu, a nie wymyślaniu obejść na problemy platformy.
Miałem taki sam problem. Przydała mi się ta wskazówka. Dzięki!