プログラミング演習Ⅲ(2023)

【課題5-04】ランチメニュー ver 1.1

プロジェクトタイプC# WPFアプリケーション
プロジェクト名Prac_5_04
ソリューション名PET5
ターゲットフレームワーク.NET 6.0 (長期的なサポート)

※ 「WPFアプリ(.NET Framework)」ではないので注意せよ!

【課題5-03】を改造して,_に示すように, ボタンを廃し ラジオボタンの選択状態が 変化したタイミングで小計を計算するように変更せよ.

画面イメージ
注意
  • この設問を解くには先に以下の課題を完了する必要がある.
  • GUI部品の名前やラベルの文言は必ず守ること(そうしないと採点ができないため).

このGUIアプリは_に示す部品を備える.

画面項目表
名前種別機能初期値/文言備考
groupBox1グループボックス部品の配置メニューラジオボタンradioButton1~4を配置するためのグループボックス.
radioButton1ラジオボタンメニューの選択チェックオン / 牛丼(300円)メニューを切り替えるためのラジオボタン - その1.チェックしたとき「メニュー」で選ばれている商品と,「サイドメニュー」で選ばれている商品の合計金額を以下のフォーマットでlabel1に表示する(「」は不要).

小計:合計金額

合計金額は選択した「メニュー」,「サイドメニュー」の合計金額である(消費税などは考慮しない).
radioButton2ラジオボタンメニューの選択チェックオフ / 親子丼(350円)メニューを切り替えるためのラジオボタン - その2.radioButton1と同じ動作を行う
radioButton3ラジオボタンメニューの選択チェックオフ / カツ丼(400円)メニューを切り替えるためのラジオボタン - その3.radioButton1と同じ動作を行う
radioButton4ラジオボタンメニューの選択チェックオフ / カレー(500円)メニューを切り替えるためのラジオボタン - その4.radioButton1と同じ動作を行う
groupBox2グループボックス部品の配置サイドメニューラジオボタンradioButton5~8を配置するためのグループボックス.
radioButton5ラジオボタンサイドメニューの選択チェックオン / みそ汁(50円)サイドメニューを切り替えるためのラジオボタン - その1.radioButton1と同じ動作を行う
radioButton6ラジオボタンサイドメニューの選択チェックオフ / サラダ(100円)サイドメニューを切り替えるためのラジオボタン - その2.radioButton1と同じ動作を行う
radioButton7ラジオボタンサイドメニューの選択チェックオフ / おしんこ(30円)サイドメニューを切り替えるためのラジオボタン - その3.radioButton1と同じ動作を行う
radioButton8ラジオボタンサイドメニューの選択チェックオフ / 豚汁(120円)サイドメニューを切り替えるためのラジオボタン - その4.radioButton1と同じ動作を行う
label1ラベル計算結果の表示小計:350円計算結果を表示するためのラベル.radioButton1の備考も参照せよ.

【プロパティの指定】
FontSizeプロパティに24を指定すること
(名前なし)ウィンドウ(メインウィンドウ)-プロジェクト作成時に自動作成されるメインウィンドウ.

【プロパティの指定】
・サイズは幅400×高さ300とする.

正しく実装できた場合,実行結果は_に示すような挙動となる12

実行結果

ヒント

【重要】「画面の構築中」を検出する
  • ラジオボタンのCheckedイベントや(今回は使用しないが)Uncheckedイベントなどは,画面の構築中にも呼び出されることがあるので注意が必要 である.
    • 「画面の構築中」とはウィンドウ内の各部品が完全に表示される前の状態であり,部品の変数がnullになっている ことがある.
    • したがって,以下のような状態である場合は処理を行わないようにすること.
      • 状態1) 当該のラジオボタンの変数がnullとなっている.
      • 状態2) イベントハンドラのsender引数がnullとなっている.
    • 「画面の構築中」はいかなる動作もさせてはいけない ため,イベントハンドラの冒頭でそのような状態を検出したら処理をはじく必要がある.
      • このために上述の 状態1状態2 を条件文として使用することで検出することができる.
      • もしくは_のようにMainWindowクラスの.IsInitializedプロパティをチェックすることで検出することができる.
「画面の構築中」の検出方法の例
1
2
3
4
5
6
private void button1_Click(object sender, RoutedEventArgs e)
{
    if ( ! this.IsInitialized ) return;

    // ...
}
【重要】「画面の構築中」を検出する : 閉じる
【重要】XAMLファイルや .cs ファイルの記述をコピーする際の注意点
  • この設問のように前提となっている課題が別にある場合,XAMLファイルや.csファイルが似通ったものになる場合がある.
  • そのような場合,既存のプロジェクトのXAMLファイルや.csファイルをコピーし,必要な部分だけを修正するという方法を用いると省力化できる.
  • しかし,既存のプロジェクトのXAMLファイルや.csファイルの内容を,新しく作ったプロジェクトに 単純にコピーするとトラブルとなる場合がある ため注意が必要である.
    • XAMLファイルや.csファイルには プロジェクトごとに異なる記述があらかじめ含まれている ため 絶対にコピーして上書きしてはならない
  • ただし,記述の一部であれば流用することは可能である.XAMLファイルや.csファイルから記述をコピーする際は以下のことに気を付けること.
    • XAMLファイルや.csファイルの記述をコピーする場合, ファイル全体をコピーしてはならない
    • 【XAMLファイルの記述をコピーする方法】 (_)
      • <Window ...></Window>中身のみ をコピー&ペーストする.
      • この際,コピー元のXAMLファイルに イベントハンドラの指定 が含まれている場合は,必ず.csファイル側でも同名のメソッドをコピーすること.
    • 【.csファイルの記述をコピーする方法】 (_)
      • class MainWindow : Window {}(クラスの終わりの中カッコ)の中身のみをコピー&ペーストする.
XAMLファイルの記述をコピーする際の注意点
.csファイルの記述をコピーする際の注意点
【重要】XAMLファイルや .cs ファイルの記述をコピーする際の注意点 : 閉じる
イベントハンドラの共有
  • 【課題5-03】でボタンがクリックされたタイミングで行っていた処理を,こちらの設問ではラジオボタンにチェックが入ったタイミングで行う.
  • 8つのラジオボタンにそれぞれ異なるイベントハンドラを設定することでも実装できるが,WPFでは 複数の部品で1つのイベントハンドラを共有すること も可能である.
    • イベントハンドラを共有するには,以下のようにする.
      • 1つめのラジオボタンに普通にイベントハンドラを新規作成する.作成されたメソッド名をここでは仮にradioButton1_Xyzzyとする.
      • それ以外のラジオボタンのイベントに,すべて↑で作成したradioButton1_Xyzzyを指定する.
        • 画面右下の「プロパティ」ウィンドウで設定することもできるが,_のようにXAMLソースを直接編集した方がはやい.
イベントハンドラの共有
イベントハンドラの共有 : 閉じる

  1. Apple社の都合により,iPhone,iPadなどのデバイスでは動画の再生はできません(Apple社はスマートフォン/タブレット製品で,意図的?にVPxやAV1コーデックのサポートを遅らせているため.参考1参考2). ↩︎

  2. Microsoft Edge で動画を閲覧するためには,AV1 Extensionをインストールする必要があります. ↩︎

Last updated on 2023-11-09
Published on 2023-11-09

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.