カウントダウンアプリ実装時のメモ
記録として残しとく。
◆ファイル操作(分離ストレージ)メモ
IsoratedStorageFile.GetUserStoreForApplicationでIsolatedStorageFileオブジェクトを取得
IsolatedStorageFile.GetFileNames()でファイル名をまとめて取れる
★IsolatedStorageFile.Dispose()って何?
恐らく後片付けメソッド。
IsoratedStorageFile.FileExists(filename)でfilenameの存在有無を確認できる
IsoratedStorageFile.DeleteFile(filename)でfilenameの削除ができる
IsoratedStorageFileStreamオブジェクトを作るのに必要なもの(コンストラクタの引数)
IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read, isf);
・Path
・FileMode
・FileAccess
・IsoratedStorageFile
使い終わったらClose()をコールする
StreamReader/StreamWriterオブジェクトを作るのに、IsoratedFileStorageStreamが必要
StreamReaderのメソッド
ReadToEnd
★他は?→ReadLine
StreamWriterのメソッド
Write()
★他は?
◆ListBoxメモ
ListBox.Items.Clear()でリストボックスの中身を消せる
◆他
拡張子の確認
if (System.IO.Path.GetExtension(filename).ToLower() == ".txt")
遷移先の画面でデータを受け取る(NavigationContext.QueryString.TryGetValue)
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
string msg = "";
if (NavigationContext.QueryString.TryGetValue("msg", out msg)) {
// TODO
}
}
◆やりたいこと
★".txt"ファイルの数を確認する
→0なら、"example.txt"を作る/1以上なら何もしない
{
// ".txt"ファイルの数を取得する
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
string[] filenames = isf.GetFileNames();
int numText = 0;
foreach (string file in filenames) {
if (".txt" == System.IO.Path.GetExtension(file).ToLower()) {
numText++;
}
}
isf.Dispose();
// ".txt"ファイルの数が0ならデフォルトファイルを作る
if (numText == 0) {
// Todo:デフォルトの文字列の内容
string content = "8:00 東京\n9:00 神奈川\n" ;
SaveFile("example.txt", content);
}
// ListBoxの表示をクリアする
listBoxTimeTable.Items.Clear();
}
★(Create画面で)OKボタン押下してテキストファイル作成
<書式チェックは保留/ファイル名が入っているかは確認する>
MessageBox.Show("Please input filename")
→Top画面に戻る
private void buttonOK_Click(object sender, RoutedEventArgs e) {
string filename = textBoxFilename.Text;
if (filename != "") {
if (".txt" != System.IO.Path.GetExtension(filename).ToLower()) {
filename += ".txt";
}
SaveFile(filename, textBoxContent.Text);
NavigationService.GoBack();
}
else {
MessageBox.Show("ファイル名を入力してください");
}
}
★(Update/Delete選択画面で)TimeTableのファイル一覧を表示する
IsoratedStorageFileでファイル名一覧を取得する
→Listboxにファイル名を格納する
→表示
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
string[] filenames = isf.GetFileNames();
listBoxTimeTable.FontSize = 48;
listBoxTimeTable.Items.Clear();
foreach (string file in filenames) {
listBoxTimeTable.Items.Add(file);
}
isf.Dispose();
}
★(選択画面からUpdate画面への遷移で)テキストファイルの中身を表示する
OnNavigatedToメソッド
選択したファイル名を取得する
ファイルを読み込む
Textboxに格納する
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
string msg = "";
if (NavigationContext.QueryString.TryGetValue("msg", out msg)) {
textBoxTimeTable.Text = LoadFile(msg);
}
}
private string LoadFile(string filename) {
string s = "";
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
if (isf.FileExists(filename)) {
IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read, isf);
using (StreamReader reader = new StreamReader(isfs))
{
s = reader.ReadToEnd();
}
isfs.Close();
Filename = filename;
}
else {
MessageBox.Show("Cannot find " + filename);
}
isf.Dispose();
return s;
}
★(Update画面で)OKボタン押下でファイルを上書き保存する
Button_Clickメソッド
SaveFileメソッドコールでいける?→いけた
NavigationService.GoBackメソッドで戻る
private void buttonOK_Click(object sender, EventArgs e)
{
string msg = "";
if (NavigationContext.QueryString.TryGetValue("msg", out msg)) {
SaveFile(msg, textBoxTimeTable.Text);
}
NavigationService.GoBack();
}
★(Deleteポップアップで)YESボタン押下でファイルを削除する
Button_YESメソッド
DeleteFileメソッド
ポップアップ消す
★この時Select画面表示した時、削除の反映されている(NavigatedToイベントハンドラが実行される)か確認
→削除反映されない
private void buttonYES_Click(object sender, EventArgs e)
{
string msg = "";
if (NavigationContext.QueryString.TryGetValue("msg", out msg)) {
DeleteFile(msg);
}
popupDeleteConfirmation.IsOpen = false;
}
private void DeleteFile(string filename)
{
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
if (isf.FileExists(filename)) {
isf.DeleteFile(filename);
}
else {
MessageBox.Show("Cannot find " + filename);
}
isf.Dispose();
}
★(CountDown画面で)textの内容をListbox表示する
HelloListboxを真似る
全行読取はStreamReader.ReadToEndメソッドを使う
1行読取はStreamReader.ReadLineメソッドを使う
★1秒ごとの処理
とりあえず固定秒からのカウントダウン
WP7Clockを真似る
// コンストラクター
public MainPage()
{
InitializeComponent();
DispatcherTimer tmr = new DispatcherTimer();
tmr.Interval = TimeSpan.FromSeconds(1);
tmr.Tick += new EventHandler(tmr_Tick);
tmr.Start();
}
void tmr_Tick(object sender, EventArgs e)
{
textBlock1.Text = DateTime.Now.ToShortDateString();
textBlock2.Text = DateTime.Now.ToLongTimeString();
}
◆課題
★コードの重複どうしよう?
共通処理はApp.xaml.csでつくる?
クラスメソッドはC#でどう書くの?StaticつければOK?
欲しい共通処理
private string LoadFile(string filename)
private void SaveFile(string filename, string content)
private void DeleteFile(string filename)
→とりあえず、各画面ごとに処理を入れ込む
リファクタリングで共通処理を用意して、置き換える
★App.xaml.csから各ページのコントロールにどうやってアクセスする?
MainPageクラスがpublicだから、どこかに宣言を書けば使えると思うけど。。