やりたいこと
登録フォーム画面を作成するとき、スクロールの位置を「フォーム部分」ではなく「画面全体」に設定したい。
まず、前提条件として、複数画面からなる登録フォームを作成することを想定している。
スクロールの位置を変えたい理由は2つ。
1つめ、常にヘッダーやフッターが表示されるとフォームの領域が狭くなるから。複雑なシステムで画面がいくつもある場合は常時表示の方がいいと思う。一方で登録画面1つだけということであれば、常にタイトルを表示させるメリットもないため。
2つめは完全に推測だが、パソコン慣れしていない人の場合、ボタンが表示されればとりあえず押してしまおうという心理が働くのではないかと思っている。
必須項目が全て表示されるまでボタンを非活性にするという工夫もあるだろうが、それはあくまでもパソコン慣れしている人に「非活性 = 何か操作が足りていない」という経験則があるため。
パソコン慣れしていない人には「なんでまだボタンが押せないのだ」というストレスを抱かせてしまう
また、上記解決策として、ボタンを非活性にすると同時に「N個の項目が未入力です」と表示させるのはいいアイデアだし、実際に取り入れたいとは思っている。そうするとなおさらフッターの高さが必要になってくるため、フッターを常時表示するのは避けたい。
実装
階層
画面レイアウト(修正前)
プロパティの設定
画面全体をスクロールさせるために、垂直方向のオーバーフローを「非表示」から「スクロール」に変更
LayoutOverFlowY:LayoutOverflow.Scroll
ヘッダーとフッターはコンポーネントの高さを参照している。参照元のコンポーネントの高さを変更した場合、参照先のコンポーネントの高さも自動的に変更されるため、数値でなくプロパティを参照することで、コンテナ側の高さを修正が不要となる。
ただし、あくまでもHeaderContainer
直下にComponentHeader
しか配置されていないのが前提である。
ヘッダーの構造は全てComponentHeader
に含める。そうでないとHeaderContainer
にさらに要素を追加した時、HeaderContainer.Height
≠ ComponentHeader_1.Height
となってしまう。
Height:ComponentHeader_1.Height
Height:ComponentFooter_1.Height
画面全体のスクロールを表示させるには、フォーム横のスクロールを非表示にしなければならない。
そうしないとスクロールが二重で表示されてしまい、分かりづらくなってしまうからだ。
コンテナにはスクロールの表示有無のプロパティがあるが、フォームにはそれがない。
また、getLastItem().Height
のようなメソッドやコレクションにアクセスをして末端のデータカードを取得する方法なども見当たらなかったため
中身の実際の高さをHeightプロパティに設定してあげる必要がある。
「名前_DataCard
」がフォームの一番下に位置するデータカードである。
また、
MainContainer
のHeightを「Form001.Height
」にして、Form001
のHeightを「名前_DataCard.Y + 名前_DataCard.Height
」にすると動作しない。
これについての原因は分からず。
もう1点、詳細設定から編集できないプロパティがある。
MainContainer
の高さ(伸縮可能)のフラグをオフにする必要がある。
オンであればデータカードが追加されても高さが固定であり、オフであればHeightの値に合わせるという解釈でよいかと思う。
Height:名前_DataCard.Y + 名前_DataCard.Height
Height:Parent.Height
画面レイアウト(修正後)
細くて分かりづらいですが、スクロールバーが画面全体に掛かるようになりました。