MTS 2010 – wrażenia po konferencji

•Październik 6, 2010 • 2 komentarzy

Była konferencja i po konferencji. Chce się nawet powiedzieć, że pozostał pewien niesmak z tym związany. Może dlatego, że poruszana była tematyka, którą udało mi się już samemu przyswoić. Ale o tym może później.

Moja sesja tematyczna prezentowała się następująco:

Najbardziej ze wszystkich sesji, w których brałem udział, podobały mi się sesje Davida Chappella oraz Liama Cavanagh, obydwie dotyczące platformy Azure. Microsoft włożył dużo aby tegoroczna konferencja promowały głównie Internet Explorer w wersji 9 oraz Windows Azure, ale trudno się nie zgodzić z ich intencjami, gdyż świat właśnie zmierza w tym kierunku, zapoczątkowanym co prawda przez Amazon 🙂 Szkoda tylko, że nie ma wersji darmowej dla developerów, którzy chcieliby się pobawić dłużej niż jeden miesiąc tą technologią…

Z ciekawostek to podczas sesji Deep Dive Microsoft Deployment Toolkit 2010 prowadzonej przez Daniela von Soesta (świetnego specjalistę w swojej dziedzinie), na której nie popisała się obsługa techniczna od rzutnika :P, Daniel uruchomił TaskManagera aby sprawdzić co się dzieje z jego kompem, że tak wolno działa, a tam szybkie moje oko dostrzegło 8 rdzeni i 16GB RAM…. Generalnie Wow. A ja muszę pracować na 2 rdzeniowym procku z 3GB RAMu…

Drugą z ciekawostek było to, że pierwszego dnia konferencji, przed jej rozpoczęciem, stoisko Promise wystawiło obok darmowe książki dla uczestników konferencji. Kto mógł, brał jak najwięcej (byłem tam i ja!!!) 🙂 Dzięki temu udało mi się wyrwać kilka okazów, które już dawno chciałem zamówić 🙂

Podsumowując konferencję mogę powiedzieć jedno zdanie:

Czas pobawić się bardziej Windows Azure 🙂

Do następnego.

Wreszcie jest – finalna wersja Windows Phone 7 Developer Tools

•Wrzesień 19, 2010 • Dodaj komentarz

Post trochę spóźniony (bo aż o 3 dni), ale jest. 16.09.2010 ukazała się finalna wersja pakietu narzędzi developerskich dla Windows Phone 7, którą możecie ściągnąć tutaj.

Co dostajemy w pakiecie?

W skład pakietu Windows Phone 7 Developer Tools wchodzi wszystko, czego potrzebujemy, do tworzenia aplikacji na tą platformę zarówno w Silverlight 4, jak i XNA 4.0. A co jest najważniejsze – wszystko to jest za darmo!!!

Za pobraniu i zainstalowaniu pakietu otrzymujemy:

  • Visual Studio 2010 Express for Windows Phone 7
  • Expression Blend 4 for Windows Phone 7
  • Silverlight for Windows Phone 7
  • XNA Game Studio for Windows Phone 7
  • Windows Phone 7 Emulator
  • Phone Registration Tool

Jeśli na waszej stacji roboczej zainstalowane już jest Visual Studio 2010 to instalator doda wsparcie do niego dla Windows Phone 7.

Jak tylko znajdę chwilkę to postaram się zaktualizować dotychczasowe dema z serii Samouczka.

Samouczek Windows Phone 7 – Counter

•Sierpień 30, 2010 • Dodaj komentarz

Moja kolejna aplikacja zademonstruje prawidłowe użycie wzorca MVVM. Oczywiście korzystamy już z niego od samego początku samouczka budując nasze aplikacje na bazie framework-a nRoute. Aplikacja wzoruje się na wersji iPhone-owej.

Aplikacja posiadała będzie prosty ViewModel składający się z jednej property zliczającej typu int oraz dwóch propert obsługujących zdarzenie „Click” o typie ActionCommand. GUI natomiast składało się będzie  z dwóch przycisków „One Less” i „One More” oraz TextBox-a wyświetlającego zliczaną liczbę.

 Czytaj dalej 'Samouczek Windows Phone 7 – Counter'

Samouczek Windows Phone 7 – MyTasks

•Sierpień 26, 2010 • Dodaj komentarz


Tak jak obiecałem jakiś czas temu, kontynuuję serię samouczka dla Windows Phone 7. Kolejną aplikacją jest MyTasks za pomocą której nauczymy się uruchamiać zewnętrzne aplikacje telefonu za pomocą kodu. Ponieważ wzoruję się na iPhone-nie gdzie do tego celu wykorzystywana jest metoda openUrl, muszę przyznać, że WP7 udostępnia bardziej bogaty interfejs i takie rzeczy jak wysłanie wiadomości SMS lub nawiązanie połączenia telefonicznego możemy wykonać za pomocą dedykowanych Task-ów z namespace-a Windows.Phone.Tasks. Zachęcam do przejrzenia całego namespace-a, jednak w mojej opinii jeszcze wiele elementów tam brakuje.

GUI

Tak jak w poprzednich aplikacjach interfejs aplikacji będzie dość prosty. Składał się będzie z 5 przycisków umieszczonych w gridzie.  Dla każdego przycisku musimy dodać Behavior ExecuteCommandAction, który spowoduje wykonanie odpowiedniej akcji z ViewModel-a.

<Grid x:Name="ContentGrid" Grid.Row="1">
	<Grid.RowDefinitions>
		<RowDefinition Height="Auto"/>
		<RowDefinition Height="Auto"/>
		<RowDefinition Height="Auto"/>
		<RowDefinition Height="Auto"/>
		<RowDefinition Height="Auto"/>
		<RowDefinition Height="*"/>
	</Grid.RowDefinitions>

        <Button Grid.Row="0" Content="Open Phone">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <nBehaviors:ExecuteCommandAction CommandBinding="{Binding OpenPhone, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
            <Button Grid.Row="1" Content="Open SMS">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <nBehaviors:ExecuteCommandAction CommandBinding="{Binding OpenSMS, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
            <Button Grid.Row="2" Content="Open Email">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <nBehaviors:ExecuteCommandAction CommandBinding="{Binding OpenEmail, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
            <Button Grid.Row="3" Content="Open Map">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <nBehaviors:ExecuteCommandAction CommandBinding="{Binding OpenMap, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
            <Button Grid.Row="4" Content="Open Browser">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <nBehaviors:ExecuteCommandAction CommandBinding="{Binding OpenBrowser, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
        </Grid>
</Grid>

Następnie musimy odpowiednio oprogramować nasz ViewModel dodając publiczne Property typu ActionCommand a następnie je zainicjalizować. Użycie poszczególnych Task-ów jest bardzo proste. Wystarczy, że utworzymy obiekt danego Task-a, ustawimy odpowiednie Property tego obiektu a na końcu wywołamy metodę Show(). Kod mojego ViewModelu poniżej:

[MapViewModel(typeof(MainPage))]
    public class MainPageViewModel : ViewModelBase
    {
        public MainPageViewModel()
        {
            InitCommands();
        }

        public ActionCommand OpenPhone { get; private set; }
        public ActionCommand OpenSMS { get; private set; }
        public ActionCommand OpenEmail { get; private set; }
        public ActionCommand OpenMap { get; private set; }
        public ActionCommand OpenBrowser { get; private set; }

        private void InitCommands()
        {
            OpenPhone = new ActionCommand(() =>
            {
                var phoneCallTask = new PhoneCallTask
                {
                    DisplayName = "Test Number",
                    PhoneNumber = "0123456789"
                };

                phoneCallTask.Show();
            });

            OpenSMS = new ActionCommand(() =>
            {
                var smsComposeTask = new SmsComposeTask
                {
                    To = "0123456789",
                    Body = "Windows Phone 7 Test SMS"
                };

                smsComposeTask.Show();
            });

            OpenEmail = new ActionCommand(() =>
            {
                var emailComposeTast = new EmailComposeTask
                {
                    To = "test@test.com",
                    Subject = "Windows Phone Test Email",
                    Body = "Wow!"
                };

                emailComposeTast.Show();
            });

            OpenMap = new ActionCommand(() =>
            {
                var searchTask = new SearchTask
                {
                    SearchQuery = "Marszałkowska, Warsaw, Poland"
                };

                searchTask.Show();
            });

            OpenBrowser = new ActionCommand(() =>
            {
                var webBrowserTask = new WebBrowserTask
                {
                    URL = "https://arturlipski.wordpress.com"
                };

                webBrowserTask.Show();
            });
        }
    }

I to wszystko 🙂 Zapraszam do czytania moich kolejnych postów 🙂

Samouczek Windows Phone 7 – Fire Light

•Sierpień 17, 2010 • Dodaj komentarz

Kolejną aplikacją z serii samouczków będzie przydatne narządko do oświetlania sobie drogi wracając wieczorową porą 🙂  poprzez wyświetlanie animacji pożaru. Najprościej byłoby wyświetlić animowany obrazek gif i by było po krzyku. Jednak my pokusimy się o zrobienie samodzielnie animacji. W tym celu skorzystamy ze storyboard napisanego programistycznie.

Przypominam, że każda aplikacja z tej serii będzie stworzona przy wykorzystaniu nRoute Toolkit 🙂

GUI

Podobnie jak w poprzednim przykładzie nasze GUI będzie dość proste. Dodajemy do głównego okna obiekt Image, nazywamy go FireImage i ustawiamy propertę Source na pierwsze zdjęcie naszej animacji:

<Grid x:Name="ContentGrid" Grid.Row="1">
          <Image x:Name="FireImage" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="Resources/fire0.jpg"/>
</Grid>

Czas na animację

Animację pożaru możemy wykonać na kilka sposobów. Jednym byłoby użycie Timera do podmieniania w określonych odstępach czasowych property Source obiektu Image z ViewModel-a. Nie jest to jednak koszerne rozwiązanie, dlatego do realizacji animacji wykorzystamy tzw. Storyboard. Wykorzystując wzorzec MVVM zobowiązani jesteśmy do wykonania całego codebehind w ViewModel-u. Niestety nie udało mi się przenieść kodu odpowiedzialnego za animację do ViewModel-u, dlatego też cały kod zawarłem w widoku.

Pierwszym krokiem było podczepienie się do event-u Loaded widoku. Następnie trzeba było stworzyć za pomocą kodu obiekt Storyboard i ustawić dla niego propertę  RepeatBehavior na Forever jak to pokazano niżej:

var storyboard = new Storyboard
{
    RepeatBehavior = RepeatBehavior.Forever
};

Następnie do wykonania animacji wykorzystamy obiekt ObjectAnimationUsingKeyFrames. Każdy z obrazków naszej animacji będzie oddzielną klatką(KeyFrame) wyświetlaną po sobie w odstępie 50ms.

            var animation = new ObjectAnimationUsingKeyFrames();

            Storyboard.SetTarget(animation, FireImage);
            Storyboard.SetTargetProperty(animation, new PropertyPath("Source"));

            storyboard.Children.Add(animation);

            for (int i = 0; i < 8; i++)
            {
                var keyframe = new DiscreteObjectKeyFrame
                {
                    KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(50 * i)),
                    Value = String.Format("Resources/Fire{0:D1}.jpg", i)
                };

                animation.KeyFrames.Add(keyframe);
            }

            Resources.Add("CandleStoryboard", storyboard);

            storyboard.Begin();

I to wszystko 🙂 Następny samouczek będzie dotyczył uruchamiania z kody zewnętrznych aplikacji takich jak wykonanie połączenia, napisanie wiadomości SMS, uruchomienie linka, itp. Zapraszam 🙂

Samouczek Windows Phone 7 – Time to Midnight

•Sierpień 10, 2010 • Dodaj komentarz

Wprowadzenie

Moją pierwszą aplikacją(z tej serii :)) na platformie WP7 będzie prosta aplikacyjka, która odmierzała będzie czas do północy.

Setup

Tak jak już wspomniałem w pierwszym wpisie z tej serii, przed przystąpieniem do tworzenia niesamowitych aplikacji na WP7 należy udać się na stronę developer.windowsphone.com i ściągnąć potrzebne do developmentu narzędzia. Dodatkowo zachęcam do ściągnięcia template-ów projektowych dla frameworka nRoute, co przyśpieszy tworzenie projektów.

Na potrzeby aplikacji sugeruję udać się na stronę Font Zone i ściągnąć trzcionkę Quartz Italic, która bardzo ładnie oddaje efekt elektronicznego zegarka z czasem, który można znaleźć u niektórych tuż przy łóżku na biurku 😉

Jak już ściągnęliście i zainstalowaliście trzcionkę to można przystąpić do stworzenia nowego projektu. Z template-ów nRoute wybieramy projekt Windows Phone 7 Application, ja nazwałem go „TimeToMidnight”. Do projektu dodajemy ściągniętą wcześniej trzcionkę i oznaczamy sposób jej kompilacji na „Content”, dzięki czemu zostanie ona dodana do paczki deploymentowej aplikacji i będzie dostępna na komórce.

Tworzymy GUI

GUI naszej aplikacji jest proste – składa się tylko z jednego textbox-a(oprócz tych dotyczących nazwy aplikacji i nazwy strony, które są dodawane standardowo) wyświetlającego pozostały czas do północy. Propertę Text dodanego Textboxa bindujemy z propertą Countdown, którą stworzymy później w ViewModel-u. Dodatkowo dla Textbox-a ustawiamy następujące parametry:

  • Width oraz Height – ustawiamy na automatyczne, czyli nie określamy dokładnych wartości;
  • Margin – czyścimy te, które zostały ustawione przez designera;
  • Horizontal and Vertical Alignment – ustawiamy na Center;
  • Foreground – normalnie ustawilibyśmy kolor trzcionki na czerwony, aby jak najlepiej oddać przykład z apps amuck, ale w tym przypadku ustawimy statyczny Resource PhoneAccentBrush, który będzie reagował na zmiany theme przez użytkownika dla całej komórki.
  • Font – jako trzcionkę ustawiamy wcześniej dodaną przez nas do projektu.
  • Font Size: 120.

Kod XAML dla obiektu ContentGrid powinien wyglądać następująco:

<Grid x:Name="ContentGrid" Grid.Row="1">
			<TextBlock Text="{Binding Countdown}" VerticalAlignment="Center" FontFamily="quartzitalic.ttf#Quartz"
			Foreground="{StaticResource PhoneAccentBrush}" FontSize="120" HorizontalAlignment="Center" />
</Grid>

Timer

Po stworzeniu GUI należy zabrać się za logikę wyliczającą czas. Do tego celu w ViewModel-u stworzymy timer, który będzie co sekunda wywoływał metodę Tick, zmieniającą czas do północy. Kod tego rozwiązania został przedstawiony poniżej:

[MapViewModel(typeof(MainPage))]
    public class MainPageViewModel : ViewModelBase
    {
        private DispatcherTimer m_timer = null;

        public MainPageViewModel()
        {
            m_timer = new DispatcherTimer
            {
                Interval = TimeSpan.FromSeconds(1.0)
            };

            m_timer.Tick += OnTick;

            m_timer.Start();
        }

        void OnTick(object sender, EventArgs e)
        {
            var midnight = DateTime.Today.AddHours(24.0);
            var timeLeft = midnight - DateTime.Now;

            Countdown = String.Format("{0:D2}:{1:D2}:{2:D2}",timeLeft.Hours, timeLeft.Minutes, timeLeft.Seconds);
        }

        public string Countdown
        {
            get
            {
                return m_countdown;
            }
            private set
            {
                m_countdown = value;
                NotifyPropertyChanged(()=>Countdown);
            }
        }

        private string m_countdown;
    }

I to wszystko :). W efekcie jednak, uruchamiając aplikację w swoich środowiskach developerskich nie otrzymacie prawidłowego czasu, ponieważ standardowe ustawienia dla emulatora Windows Phone 7 to Alaska.

Samouczek Windows Phone 7

•Sierpień 10, 2010 • Dodaj komentarz

Serię tych wpisów (zainspirowany podobnym blogiem) poświęcę tworzeniu przykładowych aplikacji w środowisku Windows Phone 7, które bazowały będą na istniejących aplikacjach stworzonych na iPhona, dostępnych na apps amuck.

Tam gdzie to możliwe pokażę jakieś ciekawe sztuczki architektoniczne i wzorce, które można wykorzystać w różnych sytuacjach. Dodatkowo każda aplikacja będzie zbudowana z wykorzystaniem frameworka nRoute.

Setup

Zanim zaczniecie zabawę z WP7 sugeruję odwiedzić stronę developer.windowsphone.com w celu zapoznania się z przykładami i pobrania darmowych narzędzi do tworzenia aplikacji na tej platformie.

Zapraszam na kolejne wpisy z serii.