【課題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とする. |
正しく実装できた場合,実行結果は_に示すような挙動となる1,2.
ヒント
【重要】「画面の構築中」を検出する
- ラジオボタンの
Checked
イベントや(今回は使用しないが)Unchecked
イベントなどは,画面の構築中にも呼び出されることがあるので注意が必要 である.- 「画面の構築中」とはウィンドウ内の各部品が完全に表示される前の状態であり,部品の変数が
null
になっている ことがある. - したがって,以下のような状態である場合は処理を行わないようにすること.
- 状態1) 当該のラジオボタンの変数が
null
となっている. - 状態2) イベントハンドラの
sender
引数がnull
となっている.
- 状態1) 当該のラジオボタンの変数が
- 「画面の構築中」はいかなる動作もさせてはいけない ため,イベントハンドラの冒頭でそのような状態を検出したら処理をはじく必要がある.
- このために上述の 状態1 や 状態2 を条件文として使用することで検出することができる.
- もしくは_のように
MainWindow
クラスの.IsInitializedプロパティをチェックすることで検出することができる.
- 「画面の構築中」とはウィンドウ内の各部品が完全に表示される前の状態であり,部品の変数が
|
|
【重要】「画面の構築中」を検出する : 閉じる
【重要】XAMLファイルや .cs ファイルの記述をコピーする際の注意点
- この設問のように前提となっている課題が別にある場合,XAMLファイルや.csファイルが似通ったものになる場合がある.
- そのような場合,既存のプロジェクトのXAMLファイルや.csファイルをコピーし,必要な部分だけを修正するという方法を用いると省力化できる.
- しかし,既存のプロジェクトのXAMLファイルや.csファイルの内容を,新しく作ったプロジェクトに 単純にコピーするとトラブルとなる場合がある ため注意が必要である.
- XAMLファイルや.csファイルには プロジェクトごとに異なる記述があらかじめ含まれている ため 絶対にコピーして上書きしてはならない.
- ただし,記述の一部であれば流用することは可能である.XAMLファイルや.csファイルから記述をコピーする際は以下のことに気を付けること.
【重要】XAMLファイルや .cs ファイルの記述をコピーする際の注意点 : 閉じる
イベントハンドラの共有
- 【課題5-03】でボタンがクリックされたタイミングで行っていた処理を,こちらの設問ではラジオボタンにチェックが入ったタイミングで行う.
- 8つのラジオボタンにそれぞれ異なるイベントハンドラを設定することでも実装できるが,WPFでは 複数の部品で1つのイベントハンドラを共有すること も可能である.
- イベントハンドラを共有するには,以下のようにする.
- 1つめのラジオボタンに普通にイベントハンドラを新規作成する.作成されたメソッド名をここでは仮に
radioButton1_Xyzzy
とする. - それ以外のラジオボタンのイベントに,すべて↑で作成した
radioButton1_Xyzzy
を指定する.- 画面右下の「プロパティ」ウィンドウで設定することもできるが,_のようにXAMLソースを直接編集した方がはやい.
- 1つめのラジオボタンに普通にイベントハンドラを新規作成する.作成されたメソッド名をここでは仮に
- イベントハンドラを共有するには,以下のようにする.
イベントハンドラの共有 : 閉じる
Apple社の都合により,iPhone,iPadなどのデバイスでは動画の再生はできません(Apple社はスマートフォン/タブレット製品で,意図的?にVPxやAV1コーデックのサポートを遅らせているため.参考1,参考2). ↩︎
Microsoft Edge で動画を閲覧するためには,AV1 Extensionをインストールする必要があります. ↩︎