SkyDrive へ移動
ダウンロードしたテンプレートは、『C:\Users\ユーザー名\Documents\Visual Studio 2012\Templates\ProjectTemplates\Visual C#\Windows Store』に保存します。
Windows Store フォルダは最初は存在しないので作成します( 好きな名前のフォルダでも Visual Studio から利用できます )
ソースコード表示
Win8 ストア : ストアブランク テンプレートを元にファイルアクセス部分を実装しています
仕様
❶ Page.Resources で XAML 内で利用する文字列を定義
❷ テキストエリアを設置( ファイルの処理の為、Package.appxmanifest にファイル利用設定 )
❸ AppBar を XAML で定義 (ボタンを左側3つ、右側2つ定義)
❹ それぞれのボタンにイベントを定義。但し、左側のファイル用ボタンは動的に作成
❺ 保存ボタンのイベントで、MessageDialog の利用サンプルを実装
❻ MessageDialog のイベントを別のソースコードに定義( partial )
❼ TextResource.cs に、StaticResource 用のクラスを定義
❽ MessageDialog 処理用の MsgBox クラス
テキストエリア
テキストエリアは、実際には TextBox で、AcceptsReturn="True" にする事によって複数行の入力が可能になります
また、ファイルのアクセスを想定して、Package.appxmanifest に『機能』と『宣言』の設定をしています
( ページのロードでは、『text.txt』というファイルの存在チェックのみ行っています )
ファイル作成ボタンと保存ボタンの初期状態
一番最初の状態ではファイルは作成されていないので左側の3つ目のボタンは『ファイル作成』となっています。
また、右側の『保存』ボタンは、使用不可となっています。
ファイル作成とファイルの削除
bExist は、MainPage で定義した private 変数で、Page の Loaded イベントで設定しています。それによって、追加するボタンを差し換えて、それぞれの状態に対してイベントを定義していますが、この処理の切り替えは Page そのもののリロードによって行われます。
// ******************************************************
// ファイルが存在するので、削除ボタンを作成して処理を登録する
// ******************************************************
if (bExist)
{
// インスタンス作成
var btn = new Button();
// スタイル
btn.Style = (Style)App.Current.Resources["DeleteAppBarButtonStyle"];
// テキスト表示
AutomationProperties.SetName(btn, "削除");
// 非同期ラムダ式
btn.Click += async (_sender, _e) =>
{
MsgBox.ShowAsync(this, "OK", "ファイルを削除します");
try
{
StorageFile strageFile = await storageFolder.GetFileAsync("text.txt");
// ファイル削除
await strageFile.DeleteAsync();
// メニュー削除
LeftBar.Children.RemoveAt(2);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
// Navigate の引数作成
App.MyParam NavigateArgs = new App.MyParam() { title = "リロード", type = 1 };
// ページを再表示
(App.Current as App).rootFrame.Navigate(typeof(MainPage), NavigateArgs);
};
LeftBar.Children.Add(btn);
SaveButton.IsEnabled = true;
}
// ******************************************************
// ファイルが存在しない。
// 1) 作成ボタンを作成して処理を登録する
// 2) 保存ボタンを選択できないようにする
// ******************************************************
else
{
// インスタンス作成
var btn = new Button();
// スタイル
btn.Style = (Style)App.Current.Resources["AddAppBarButtonStyle"];
// テキスト表示
AutomationProperties.SetName(btn, "ファイル作成");
// 非同期ラムダ式
btn.Click += async (_sender, _e) =>
{
MsgBox.ShowAsync(this, "OK", "ファイルを作成します");
try
{
await storageFolder.CreateFileAsync("text.txt");
// メニュー削除
LeftBar.Children.RemoveAt(2);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
// Navigate の引数作成
App.MyParam NavigateArgs = new App.MyParam() { title = "リロード", type = 2 };
// ページを再表示
(App.Current as App).rootFrame.Navigate(typeof(MainPage), NavigateArgs);
};
LeftBar.Children.Add(btn);
SaveButton.IsEnabled = false;
}
ページのリロード
App.xaml.cs で、最初のページのロードが行われる際、以下のコードで表示する場所の骨格が作成されています。
public Frame rootFrame = Window.Current.Content as Frame;
rootFrame は、Window( 現在のアプリケーションウインドウ ) の Current(現在アクティブなウィンドウ)の UI である Content を Frame(フレーム)として取得しています。これは、仕様だと思われるので詳細な説明は Microsoft のドキュメントからは読み取りませんが、ブラウザと同様であると考えると良いと思います。
実際は、この rootFrame に、new Frame() でインスタンスを作成した上で利用されます。
つまり、アプリケーションの表示部分であるフレームに、実体であるページを XML ベースでロードするという手順になります。しかし、最初のロードで ページのインスタンスを作成する為に、Navigate メソッドが使用されています。
これは、この考え方でリロードすると、Navigate メソッドを実行する毎にページが新たに作成される事を意味します。
実際には、GoBack メソッドでも新たにインスタンスが作成されるようなので、画面の状態を保持して画面を切り替えるには、rootFrame.Content に保存しておいたページのインスタンスを戻すという処理が必要になります。( ここでは新しいインスタンスが都合が良いのでその方法は使っていません )
ファイルシステムへのアクセス
Windows の Shell のような感じで、フォルダオブジェクトを取得してそこからファイルオブジェクトを作成して、作成・削除・複製等の基本的な処理を行います。
ファイルの中身の更新は、FileIO という static なクラスの static なメソッドを使って、その引数としてファイルオブジェクトを使用します。
await FileIO.WriteTextAsync(strageFile, this.TextData.Text);
テキスト用のメソッドは、UTF-8N 前提の処理です。他のキャラクタセットとしてアクセスするには、バイナリデータとしてアクセスする必要があります。
Microsoft のサンプル
関連する情報
XAML コードを横に長く表示させずに、属性毎に縦に表示させる設定