windows phone 7アプリ 実際に開発してみてわかったいろいろ

53
Windows Phone 7 ゕプリ 実際に開発してみてわかったいろいろ @kaorun 2011/04/16

Upload: kaoru-nakajima

Post on 19-May-2015

5.517 views

Category:

Technology


5 download

DESCRIPTION

すまべん@関東#12で発表させていただいた資料です。 (フォントが悲しかったのでPDFで再登録) http://d.hatena.ne.jp/kaorun/20110416/1302960944

TRANSCRIPT

Page 1: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Windows Phone 7 ゕプリ

実際に開発してみてわかったいろいろ

@kaorun

2011/04/16

Page 2: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

こんな人

• Name: Nakajima Kaoru

• Twitter: @kaorun

• Hatena: id:kaorun

• サイボウズ・ラボ所属

– Software Design Engineer

–主にMS担当係

*1 iPhone, Androidの開発をしたことは無い

Page 3: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

WP7日本語入力ゕプリ

Utakata Japanese TextPad 絶賛公開中

主な機能: • アプリ内でフリック入力 • SocialIME/Google CGI APIでかな漢字変換 • メール・SMS送信、検索、Twitterでツイート • MS-Plライセンスでリポジトリ公開中

https://bitbucket.org/kaorun/utakata

Page 4: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

さて本日は

Page 5: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Windows Phone 7ゕプリの開発

について

Page 6: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

あしからず #1

• 以下の内容は含まれません (たぶんきっと)

– 開発環境の作り方

– App Hubの登録とか

– Silverlightってなんだ?

– VSやBlendでコードとデザインの分離

– DataBindingの理解は必須だよね

– MVVM, Rxでカッコイイコードの書き方

– 他のプラットフォームと比較して云々

– XNAとか

「Microsoftさんのイベントやカンフゔレンスに行くといいよ」

Page 7: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

あしからず #2

• 以下の内容は…

– Utakataを作りながら学んだこと多数

–つまりUtakataのソースを見ても一部しか反映されていません!

• WPFやSilverlightの手練れな人には言うまでもないことも多いです

Page 8: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

なんなの?

• いろいろ謎な用語が出てきます

• 実際に開発にあたってネックになるポイントがメイン

• あとで調べる際のキーワードにでも

Page 9: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Windows Phone 7ってナニモノ?

Page 10: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

• MSの新しいスマートフォンでしょ?

• Windows Mobileとの互換性を捨てて新規開発された云々…

• ぬるぬるサクサク

• ゕニメーションカッコイイ

• OfficeやらXboxやら

Page 11: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Windows Phone 7ってナニモノ?

Page 12: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

100% Managed Code

Page 13: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Pure Silverlight OS

+ XNA

Page 14: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

XAML & C#

Page 15: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

WP7アプリ開発とは

Page 16: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

ガリガリ

ぬるぬる

Page 17: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

WP7ゕプリの開発とは

• Visual StudioでXAMLとC#をガリガリ書くぜ

– IntelliSense最強伝説

• BlendでXAMLをぬるぬる生成するぜ

–テンプレート編集でコントロールのスタイルをいじりまくり

–なんでもボタンやコントロールに

– StoryboardやViewStateで華麗にゕニメーションをキメろ

Page 18: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

個人的なBlendとVSの使い分け

Visual Studio

Expression Blend

VS vs Blend

Page 19: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

用法・用量を守って正しくお使いください

• 以下の方々にはお勧めしません (今のところ)

– Visual Studio、IDEにゕレルギーのある方

– emacsをこよなく愛する人

– vimでないと体が動かない人

– eclipse workerは医師にご相談ください

Page 20: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

まずはXAMLを覚えてもらおうか

• HTMLみたいなもんですよ。

• ひな形はVisual Studioが生成してくれる

• IntelliSenseでカタカタやってればすぐ覚えるよ – HTMLより単純で高度

– がんばろうDataBinding

• Blendでいろいろ弄り回して出力されたXAMLを読んでみる – Blendの使い方はとにかく動画で見る

– FlashやIllustratorで作ったドロー要素が全部XMLで出力されるような感じ

Page 21: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Silverlightの基本原則とセオリー

• XAMLで書けるモノはコード(C#)でも書ける

• コードで書かれてることも結構XAMLでも書ける – 「えっ、そこまでXAMLでできちゃうの?」

• ロジックの実装はできるだけViewModelに分離する(MVVM)

• ViewModelでDependency Propertyを実装してXAMLでDataBindingする

• ただし、速度と美しさは必ずしも両立しない!?

Page 22: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

WP7ゕプリ開発のいろいろ

• なんとなく見目のいいモノはわりとすぐできる

• WP7っぽさを出すのが案外タイヘン –標準のフレームワークがまだショボイのでいろいろライブラリが必用なのが現状

• 今のところ入門以外のドキュメントはほぼ英語

• デスクトップ版SilverlightやWPFのノウハウはだいたい使える

Page 23: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Expression Blend英語版をおすすめする理由

• Silverlight開発はXAMLオブジェクトをどう扱うか

• XAMLのElement, AttributeとBlendの機能名が一対一対応

• 英語が嫌いでもオブジェクト名が英語なんだからしょうがない

• ビジュゕルなツールなのでコマンド・メニュー名とかより何がどこにあるか覚えちゃえばOk

• プロダクトキーは各言語共通じゃないかな…

Page 24: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

教科書(?)通りのやり方

• VSでプロジェクト作成

• 基本的な実装

• Blendで編集・味付け

• コードビハインドの実装

• …

Page 25: Windows phone 7アプリ 実際に開発してみてわかったいろいろ
Page 26: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

何が起きるか

• XAMLフゔイルの巨大化

• 可読性が極めて悪い

• 再利用性の低下

• コードビハインドもぐしゃぐしゃに…

Page 27: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

ページの実装

スタイルとかなんとか

Page 28: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

対策案

• スタイルをリソース化して分離

• UserControl化して分離

• カスタムコントロール化

Page 29: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

スタイルをリソース化

• Blendでテンプレート編集

• リソースを別フゔイルに

– app.xamlに組み込む

–リソースフゔイルを分離・参照

–複数のリソースフゔイルを参照

Page 30: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

Demo

Page 31: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

app.xamlに組み込み

<Application

x:Class="WindowsPhonePivotApplication3.App"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"

xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">

<!--Application Resources-->

<Application.Resources>

<ItemsPanelTemplate x:Key="HorizontalItemsPanel">

<StackPanel Orientation="Horizontal"/>

</ItemsPanelTemplate>

<Style x:Key="HorizontalListBoxStyle" TargetType="ListBox">

<Setter Property="Background" Value="Transparent"/>

<Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>

<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>

</Style>

</Application.Resources>

</Application>

アプリ全域で使えるスタイル化

Page 32: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

ResourceDictionaryを参照

<Application …>

<!--Application Resources-->

<Application.Resources>

<ResourceDictionary Source="/Styles.xaml">

</Application.Resources>

</Application>

スタイル定義をリソースファイルに分離

Page 33: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

複数のResourceDictionaryを参照

<Application …> <!--Application Resources--> <Application.Resources > <ResourceDictionary > <ResourceDictionary.MergedDictionaries > <ResourceDictionary Source ="Styles.xaml"/> <ResourceDictionary Source ="Styles2.xaml"/> </ResourceDictionary.MergedDictionaries > </ResourceDictionary > </Application.Resources > … </Application>

Page 34: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

でも…

Page 35: Windows phone 7アプリ 実際に開発してみてわかったいろいろ
Page 36: Windows phone 7アプリ 実際に開発してみてわかったいろいろ
Page 37: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

それUserControlで

• [追加]/[新しい項目]

[Windows Phone User Control] するだけ

• カンタン!

Page 38: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

UserControlにすると

• そのコントロールの中だけで終始

• 使い回しが効かない

• なんとなくゴチャゴチャした実装になりがち

• 親ページと干渉することがある希ガス

Page 39: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

こういう時にUserControlを使うといい

• HTMLでいうところのiframe感覚

• 枠の中でいろいろした奴を使いまわしたり

• ある程度まとまった実装として固めたいとき

Page 40: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

カスタムコントロールって?

• WPFにはテンプレートがあるのだが…

• ようするにControl継承クラス

• やりたいことはコードで書け

• 原則としてコードだけで実装

public class HogeControl : Control { }

Page 41: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

そんなの面倒でやってられません

Page 42: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

XAML使えないの?

Page 43: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

それgeneric.xamlで

• /Themes/generic.xaml というフゔイルを作る

• 勝手に読み込まれる

• 既存コントロールの派生クラスでテンプレートとしてスタイルを読み込み

• ButtonとかTextBoxとか派生したカッコイイ

コントロールをxamlとコードで作っちゃう

• 詳細は、 http://d.hatena.ne.jp/kaorun/20110323/1300874396

Page 44: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

generic.xamlのお約束

• 以下の記述はできません

–イベントハンドラ指定

–トリガー

–ようするにXAMLからコードが呼ばれるような動作は不可

• コードビハインド側からxaml要素を拾ってイベントなどを引っかけるイメージで実装

• Parts&Stateモデルによる実装

Page 45: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

generic.xaml の書き方

<ResourceDictionary

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"

xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"

xmlns:my="clr-namespace:WindowsPhoneApplication1">

<ControlTemplate x:Key="PhoneDisabledTextBoxTemplate" TargetType="TextBoxmy:WatermarkTextBox">

</ControlTemplate>

<Style x:Key="WatermarkTextBox" TargetType="TextBoxmy:WatermarkTextBox">

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="TextBoxmy:WatermarkTextBox">

Page 46: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

generic.xamlを参照するクラス

namespace WindowsPhoneApplication1 { public class WatermarkTextBox : TextBox { private Grid textboxRoot; private TextBlock textWatermark; public WatermarkTextBox() { DefaultStyleKey = typeof(WatermarkTextBox); } public override void OnApplyTemplate() { base.OnApplyTemplate(); this.textboxRoot = GetTemplateChild("textboxRoot") as Grid; if (this.textboxRoot != null) this.textWatermark = textboxRoot.FindName("textWatermark") as TextBlock; } } }

Page 47: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

細かいキーポイント

• まずはPanoramaプロジェクトを作成してソースをじっくり読もう

– ViewModelの使い方

–なにがどこにあるのか、など

• レイゕウトがわけわからなくなったらBorderデバッグ

–とりあえず<Border>で入れ子にしてみる

• GPUが使われるコントロールとSoftwareレンダリングのコントロールがある

Page 48: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

基本的なコネタ

• ページ遷移は NavigationService.Navigate() NavigationService.GoBack()

• データの永続化は IsolatedStorageSettings.ApplicationSettings[]

• 一時的なデータ保存は PhoneApplicationPage.State[]

• とりあえずメッセージ MessageBox.Show()

• とりあえずコンソール出力 Debug.WriteLine()

Page 49: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

その他資料

Page 50: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

まずはここ

• MSDN - Windows Phone Development http://msdn.microsoft.com/en-us/library/ff402535

• Windows Phone 開発者向け技術情報

http://msdn.microsoft.com/ja-jp/windowsphone/ff191182

Page 51: Windows phone 7アプリ 実際に開発してみてわかったいろいろ

なにかわからない時は

• USのApp Hub Forumで聞くといいよ! – 殆どの質問は偉い人が即答

– 既出ならリンクを張ってくれる

– 中の人が答えてくれる場合も – 既存の質問をいろいろ見て書き方の参考にするといいんじゃないかな

• 日本語のフォーラムもできたよ! – App Hub 日本語フォーラム

http://forums.create.msdn.com/forums/default.aspx?GroupID=16 – Windows Phone フォーラム

http://social.msdn.microsoft.com/Forums/ja-JP/category/windowsphone

Page 53: Windows phone 7アプリ 実際に開発してみてわかったいろいろ