Windows phone 7アプリ 実際に開発してみてわかったいろいろ2. こんな人
• Name: Nakajima Kaoru
• Twitter: @kaorun
• Hatena: id:kaorun
• サイボウズ・ラボ所属
– Software Design Engineer
– 主にMS担当係
*1 iPhone, Androidの開発をしたことは無い
3. WP7日本語入力ゕプリ
Utakata Japanese TextPad 絶賛公開中
主な機能:
• アプリ内でフリック入力
• SocialIME/Google CGI APIでかな漢字変換
• メール・SMS送信、検索、Twitterでツイート
• MS-Plライセンスでリポジトリ公開中
https://bitbucket.org/kaorun/utakata
6. あしからず #1
• 以下の内容は含まれません (たぶんきっと)
– 開発環境の作り方
– App Hubの登録とか
– Silverlightってなんだ?
– VSやBlendでコードとデザインの分離
– DataBindingの理解は必須だよね
– MVVM, Rxでカッコイイコードの書き方
– 他のプラットフォームと比較して云々
– XNAとか
「Microsoftさんのイベントやカンフゔレンスに行くといいよ」
7. あしからず #2
• 以下の内容は…
– Utakataを作りながら学んだこと多数
– つまりUtakataのソースを見ても一部しか反映
されていません!
• WPFやSilverlightの手練れな人には言うま
でもないことも多いです
20. まずはXAMLを覚えてもらおうか
• HTMLみたいなもんですよ。
• ひな形はVisual Studioが生成してくれる
• IntelliSenseでカタカタやってればすぐ覚える
よ
– HTMLより単純で高度
– がんばろうDataBinding
• Blendでいろいろ弄り回して出力されたXAML
を読んでみる
– Blendの使い方はとにかく動画で見る
– FlashやIllustratorで作ったドロー要素が全部XML
で出力されるような感じ
24. 教科書(?)通りのやり方
• VSでプロジェクト作成
• 基本的な実装
• Blendで編集・味付け
• コードビハインドの実装
• …
26. 何が起きるか
• XAMLフゔイルの巨大化
• 可読性が極めて悪い
• 再利用性の低下
• コードビハインドもぐしゃぐしゃに…
31. 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> アプリ全域で使えるスタイル化
32. ResourceDictionaryを参照
<Application …>
<!--Application Resources-->
<Application.Resources>
<ResourceDictionary Source="/Styles.xaml">
</Application.Resources>
…
</Application>
スタイル定義をリソースファイルに分離
33. 複数のResourceDictionaryを参照
<Application …>
<!--Application Resources-->
<Application.Resources >
<ResourceDictionary >
<ResourceDictionary.MergedDictionaries >
<ResourceDictionary Source ="Styles.xaml"/>
<ResourceDictionary Source ="Styles2.xaml"/>
</ResourceDictionary.MergedDictionaries >
</ResourceDictionary >
</Application.Resources >
…
</Application>
40. カスタムコントロールって?
• WPFにはテンプレートがあるのだが…
• ようするにControl継承クラス
• やりたいことはコードで書け
• 原則としてコードだけで実装
public class HogeControl : Control
{
}
45. 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">
…
46. 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;
}
}
}
47. 細かいキーポイント
• まずはPanoramaプロジェクトを作成して
ソースをじっくり読もう
– ViewModelの使い方
– なにがどこにあるのか、など
• レイゕウトがわけわからなくなったら
Borderデバッグ
– とりあえず<Border>で入れ子にしてみる
• GPUが使われるコントロールとSoftwareレ
ンダリングのコントロールがある
48. 基本的なコネタ
• ページ遷移は
NavigationService.Navigate()
NavigationService.GoBack()
• データの永続化は
IsolatedStorageSettings.ApplicationSettings[]
• 一時的なデータ保存は
PhoneApplicationPage.State[]
• とりあえずメッセージ
MessageBox.Show()
• とりあえずコンソール出力
Debug.WriteLine()
50. まずはここ
• MSDN - Windows Phone Development
http://msdn.microsoft.com/en-us/library/ff402535
• Windows Phone 開発者向け技術情報
http://msdn.microsoft.com/ja-jp/windowsphone/ff191182
51. なにかわからない時は
• 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