設定の保存
最後に新しいContractを紹介します。Map Appの状態や設定を保存できるようにしてみましょう。
分離ストレージ
.NET FrameworkやSilverlightでは,
Map Appでもこの分離ストレージが利用できます。ただし,
MyPhotoPlugin.
[ImportSingle("Microsoft/IsolatedStorageContract", ImportLoadPolicy.Synchronous)]
public IsolatedStorageContract IsolatedStorageContract { get; set; }
分離ストレージを使用したデータは,
My Photo Map Appに追加された写真の保存
今回のアプリケーションでは分離ストレージに,
保存する内容は,
- ID
- 名前
- 経緯度
- サムネイル画像
サムネイル画像は写真ごとに別のファイルとして,
分離ストレージにファイルを作成するには,
private PluginIsolatedStorageFile IsolatedStorageFile
{
get
{
return this.plugin.IsolatedStorageContract.GetPluginSpecificIsolatedStorageFile(this.plugin.Token);
}
}
ちなみにファイルを作成して設定を保存する方法以外にもPluginIsolatedStorageSettingsクラスを使用した方法もあります。次のように,
var settings = this.plugin.IsolatedStorageContract.GetPluginSpecificIsolatedStorageSettings(this.plugin.Token);
// 設定の保存
settings["key"] = "value";
// 設定の参照
string value;
if (settings.TryGetValue<string>("key", out value))
{
// Do something
}
保存処理
それでは,
<?xml version="1.0" encoding="utf-8"?>
<photos>
<photo id="1a1618d9-a138-4f61-9161-278dd6d5c65c"
name="DSC00001.JPG"
latitude="36.087925"
longitude="139.7249733" />
<photo id="a03D363a-7a2B-42fc-8d53-f3e78a59d2b6"
name="DSC00002.JPG"
latitude="36.077934"
longitude="139.719575" />
</photos>
XMLファイルを作成する部分のメソッドは次のように記述します。
private void Save()
{
var stream = IsolatedStorageFile.CreateFile("photos.xml");
var writer = System.Xml.XmlWriter.Create(stream);
writer.WriteStartDocument();
writer.WriteStartElement("photos");
foreach (var item in PhotoItems)
{
writer.WriteStartElement("photo");
writer.WriteStartAttribute("id");
writer.WriteString(item.Id);
writer.WriteEndAttribute();
writer.WriteStartAttribute("name");
writer.WriteString(item.Name);
writer.WriteEndAttribute();
// 経緯度の書き込み
var pin = (PointPrimitive)item.Primitive;
writer.WriteStartAttribute("latitude");
writer.WriteString(pin.Location.Latitude.ToString());
writer.WriteEndAttribute();
writer.WriteStartAttribute("longitude");
writer.WriteString(pin.Location.Longitude.ToString());
writer.WriteEndAttribute();
writer.WriteEndElement(); // </photo>
}
writer.WriteEndElement(); // </photos>
writer.Close();
stream.Close();
}
このSaveメソッドを呼び出す場所は,
後は,
// 画像の読み込み
var img = new BitmapImage();
using (var ms = new MemoryStream(info.ThumbnailData))
{
img.SetSource(ms);
// (以下を追記)
// ID の名前で画像を保存
using (var f = IsolatedStorageFile.CreateFile(entity.Id))
{
ms.WriteTo(f);
}
}
保存部分は以上です。分離ストレージに保存したファイルは,
読み取り処理
実行時に,
public void Load()
{
if (!this.IsolatedStorageFile.FileExists("photos.xml"))
{
return;
}
try
{
var stream = this.IsolatedStorageFile.OpenFile("photos.xml", FileMode.Open);
var reader = System.Xml.XmlReader.Create(stream, new System.Xml.XmlReaderSettings());
while (reader.Read())
{
if (reader.NodeType == System.Xml.XmlNodeType.Element &&
reader.LocalName == "photo")
{
var entity = new PhotoEntity();
reader.MoveToAttribute("id");
entity.Id = reader.Value;
reader.MoveToAttribute("name");
entity.Name = reader.Value;
var location = new Location();
reader.MoveToAttribute("latitude");
location.Latitude = Convert.ToDouble(reader.Value);
reader.MoveToAttribute("longitude");
location.Longitude = Convert.ToDouble(reader.Value);
// プッシュピン作成
entity.Primitive = this.plugin.PushpinFactoryContract.CreateStandardPushpin(location);
// 画像読み込み
entity.BitmapImage = new BitmapImage();
entity.BitmapImage.SetSource(IsolatedStorageFile.OpenFile(entity.Id, FileMode.Open, FileAccess.Read));
this.plugin.MainLayer.Entities.Add(entity); // レイヤーに追加
PhotoItems.Add(entity); // コレクションに追加
RegisterPopup(entity); // ポップアップ登録
}
}
}
catch (Exception)
{
// Do nothing
}
}
このLoadメソッドを呼び出すタイミングですが,
MyPhotoPlugin.
public override void Initialize()
{
base.Initialize();
this.MainLayer = new MyPhotoLayer(this.Token, this);
((MyPhotoPanel)this.MainLayer.Panel).Load(); // 追加
}
以上でMy Photo Map Appの完成です。実行して動作を確認してみてください。うまく動いたでしょうか?
おわりに
My Photo Map Appの作成は,