WindowsPhone7

最近、起業の資金が足らないので、バイトとしてWindowsPhone7のプログラムを書いています。なかなかに期限ぎりぎりの上に自分はSilverlightどころかC#さえ触ったことがなかったのでいい感じに悲惨なのですが、日本語資料がなかったのでかなり大変でした。ちょっとちょこちょこ書いていきたいと思います。続く気はしない(ぁ


情報

まず、情報があるサイトです。


日本語の記事は導入にはいいかもしれませんが、コントロールについての言及がかなり少ないです。主にCodeSample見つつがいいかも。
またToolkitというのは、MSが作っている、正規のコントロールになれなかったもの群らしく、ToggleSwitchなどがあります。

UIの簡単な説明

UI系としては、

  • SplashScreen
  • Page
  • AppricationBar
  • SystemTray

などがあります。以上でかいたPageはユーザーが自由に使える領域というざっぱな意味で書いているのでPivotなどはもしかしたらPageじゃないのかもしれません。まだ使ってないのでわかりかねます。

SplashScreen

アプリの起動待ち画面です

Page

開発者が自由に使える領域

AppricationBar

これは、いま作っているアプリの例ですが、この下にあるwith locationとかのメニューがあるのがApplicatonBarです。それぞれのアプリケーションで任意のメニュー、アイコンを追加できます。アイコンは4つまでです。Clickイベントが取れるので、ボタンのように扱えます。

SystemTray

バッテリー情報、時計などが表示されている画面上方に表示されるトレイ。ここは任意には作れませんが、メッセージは飛ばせます。

導入

WindowsPhone7の開発環境はインストーラーが用意されているので、それだけをさくっと入れれば入ります。VisualStudioですが、C#の環境などを事前に入れてなくても必要なものはすべて入るようです。詳しいところは日本語解説も結構ありそうなので省きます。
インストールが終わったら、とりあえず動かします。ゲームじゃないので、ProjectはSilverlightWindows Phone Applicationです。適当に名前をつけたらそのままDebug走らせます。何もしなくてもタイトルだけのプログラムが立ち上がります。ここで分かってもらえると思いますがAndroidとかと比べると驚異的な位エミュレーターが早いです。正直毎回うっかり消しても苦にならないほど。

サンプルとか

導入はこの辺にしてざっくざく切っていきます。以下あまり知らないのにメソッドとかいう用語つかうので間違ってたら指摘願います。

ページを増やす

Solution Explorerで適当にWindows Phone Portrait Pageを足すとかすれば新しいページを作れます。既存のページをコピーしても大丈夫です。
Button等のクリックで別のページに移動するには

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

このような感じで大丈夫です。たとえば、button1をクリックした場合だと

 private void button1_Click(object sender, RoutedEventArgs e)
        {
                this.NavigationService.Navigate(new Uri("/NewPage.xaml", UriKind.Relative));
        }

とかけば大丈夫です。(ただし、XAML内でbutton1のクリック時に呼ぶイベントが別名になってる場合はメソッド名変わります、当然ですが)


また、引数を付けることもできて、

       NavigateTo("/NewPage.xaml?msg=test");

このようにして、後ろに「?引数名=値」とすると、

NavigationContext.QueryString.TryGetValue("msg", out msg)

これで、msgという変数に出力してくれます。たとえば、

       protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            string msg = "";

            if (NavigationContext.QueryString.TryGetValue("msg", out msg))

                textBlock1.Text = msg;

        }

このようにすると、飛ばされてきたときにメッセージを受け取ることができます。ここではtextBlock1の文字を受け取った文字に置き換えています。
OnNavigatedToは飛ばされてきたときに呼ばれるメソッドです。

ApplicationBarを使う

ApplicationBarは、簡単に使えて、かつ普段は隠せたりするので非常に便利です。ApplicationBarはxamlファイルのほうでは定義せず、csのほうで定義します。
以下にサンプルを掲載します。

using Microsoft.Phone.Shell;
            //Initializing ApplicationBar
            ApplicationBar = new ApplicationBar();
            ApplicationBar.IsMenuEnabled = true;
            ApplicationBar.IsVisible = true;
            ApplicationBar.Opacity = 1.0;


            ApplicationBarMenuItem locateItem = new ApplicationBarMenuItem("With Locate");
            locateItem.Click += new EventHandler(locateItem_Click);

            ApplicationBarMenuItem interestedItem = new ApplicationBarMenuItem("With Interested");
            interestedItem.Click += new EventHandler(interestedItem_Click);


            ApplicationBar.MenuItems.Add(locateItem);
            ApplicationBar.MenuItems.Add(interestedItem);

(2010/11/06)ApplicationBarを使うためには「using Microsoft.Phone.Shell」を記述する必要があります。
このコードは、上のほうに掲載した、Searchのページで実際に使っているコードです。コードはPageのインストラクタにでも貼り付けておくといいと思います。
みたらわかると思いますが、ざっくり説明すると

ApplicationBarMenuItem locateItem = new ApplicationBarMenuItem("With Locate");

ここのWith Locateがメニューアイテム名になります。

locateItem.Click += new EventHandler(locateItem_Click);

ここで、locateItem_Clickというメソッドをクリック時に呼び出すように指定しています。
それで最後に、ApplicationBarに追加するという形です。
また、iconを追加したい場合は、

            ApplicationBarIconButton enabled = new ApplicationBarIconButton(new Uri("/Images/menuenabled.png", UriKind.Relative));
            enabled.Text = "enabled";
            enabled.Click += new EventHandler(enabled_Click);

            ApplicationBar.Buttons.Add(enabled);

このような感じになります。このコードはオフィシャルのApplicationBarのサンプル引用です。
あと、このApplicationBarで使うアイコンは「Program files/Microsoft SDKs\Windows Phone\v7.0\Icons」の中にある程度用意されているので、それを使うといいと思います。


大学に行かないといけないのでとりあえずここらへんで。