このような場合、Model 側では、struct Point を使い、View 側では利便性を考えて class Point を使うという方法があります。そして、それぞれのデータを定義するのはメモリ効率的に冗長であるので、class Point では struct のほうを内包させます。
class Point { struct Point *_pt ; getX() { return _pt->x ; } setX( int x ) { _pt->x = x; } … };
この記述は、前回書いた通り、Model の構造に密着し過ぎているために、Model の変更に対して過敏になりすぎます。また、View での変更に対して過敏すぎます。なので、実際には、struct Point と class Point のメモリの冗長性を諦めます。最近のメモリ容量から考えると、二重化させても問題ないでしょうし、既に永続化がされているのですから Model のメモリ領域は解放してしまうことも可能です。これは場合によりけりでしょう。
ただし、Model の Point の構造は View ほど変えないほうが無難です。Model の構造イコール可搬性を意味するので、どのシステム、アーキテクチャに持って行っても「同じ Model の構造を使える」ということは重要です。なので、実際に永続化された構造(ファイルに保存されたバイナリデータ、XMLデータ、データベースの構造)と対になるように Model を作ります。
さて、Model の Point と View の Point のコンバートは静的な構造の変換でしかすぎませんが、Pointの集合体である Mesh は、Model と View とでは随分と違います。
Metro Application の場合には、ユーザーがアプリケーションをバックグラウンドに置くことができます。と言いますか、画面を切り替えると、表のアプリはバックグラウンドに追いやられてしまうわけです。このバックグラウンドに追いやらられたアプリは、なんらかのタイミングでサスペンド(一時停止)となります。更に、メモリが足りなくなるとサスペンドからアプリは終了に移行させられます。
という動きになっています。いやいや、実に単純明快。これだと途中の Point, Mesh かつ View 独特のデータを永続化しないで済みます。
で、果たして Metro Application の場合はどうなるのかというと、実際のところはよく分かりません。復元せよということにはなっていますが、People などのいくつかの標準機能を途中で落としてみると、スクロール位置までは保管していないようです。まあ、実際に Windows Store が動き出すと、そのあたりの規約もゆるゆるになるかと。
/// <summary>
/// Notifies listeners that a property value has changed.
/// </summary>
/// <param name="propertyName">Name of the property used to notify listeners.</param>
void BindableBase::OnPropertyChanged(String^ propertyName)
{
PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
}
実装のほうも簡単で、プロパティの「文字列」を受け取って、PropertyChanged を実行しているだけです。この PropertyChanged は、XAML 側から登録されるものです。プロパティ名を直接渡さずに、PropertyChangedEventArgs で包むところが冗長な気がしますが(特に ref new になっているところ)、引数の型を固定したかったなのかもしれません。
metro アプリを store に出店させるためには、スナップや回転に対応しないといけない…ってことになっていますが、これが結構面倒、ということを実演します。まぁ、grid を使ってタイリングで配置をさせた場合は、ざっくりと作ればよいのですが、今回のメモ帳のように背景に bitmap が貼りつけてある場合は、大変…ってことなのです。
ひとまず、Windows Phone 7 の場合は、iPhone 並みに滑らかに回転するそうです。そうなると、Windows 8 metro アプリの場合も綺麗に回転される、というのが想像できそうですね。いまのところ、Acer w500 に windows 8 rp を入れた段階ではバタバタとするので「残念」な気がしていたのですが、製品版にちょっと期待。
カテゴリー:C#, windows 8|Community Open Day 2012 の補足その4 はコメントを受け付けていません
更に云うと、Windows 8 上の metro アプリから、同じコンピュータにあるログサーバーにアクセスをする場合には、もうひとつ設定が要るのです。metro アプリを Visual Studio 2012 上でデバッグモードで動かしている場合は大丈夫なのですが、普通に metro アプリをインストールして動かそうとするとログサーバーにメッセージが飛ばないという現象です。
ちなみに、パッケージ名は変更できるんですが、パッケージファミリ名は変更できません。Visual Studio 2012 が自動的に付加します。まぁ、どこかの設定ファイルに書かれていると思うのですが、ちょっと分かりませんね。パッケージ名を変更してもパッケージファミリ名は変更されないので、まあ、そういう仕様なのかと。
カテゴリー:C#, windows 8|Community Open Day 2012 の補足その2 はコメントを受け付けていません
サーバーに接続できない場合もあるので、try-catch は必須ですね。また、このパターンだといちいち new HttpClient をしているので、本当は別に privete 変数で保持したほうがいいと思います。
private void OnSuspending(object sender, SuspendingEventArgs e)
{
App.DebugLog("OnSuspending");
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
deferral.Complete();
}
metro アプリ自体のサスペンドは、App.OnSuspending になるので、ここに仕込みます。