カウントダウンアプリ実装時のメモ

記録として残しとく。

◆ファイル操作(分離ストレージ)メモ
	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だから、どこかに宣言を書けば使えると思うけど。。