Control.Top
とを操作することで、コントロールの下部を揃えることができますControl.Height
。そして同様にControl.Right
。しかし、.NET がこれらのプロパティを直接変更できないようにしたのはなぜでしょうか? 私がコントロールポジショニングを扱ってきた最後のいくつかのフェイズ以来、それはイライラします。
6 に答える
短い答え:
技術的に必要なためではなく、/または/が変更されたときに再計算されるのはこれらのプロパティであることを文書化する方法として、作成Bottom
および読み取り専用になっていると思います。Right
Top
Height
Left
Width
長い答え:
2つのプロパティセットがあります。1つは絶対座標(、、、Top
)用で、もう1つは寸法(、Bottom
)用Left
です。これらの間の関係は、次の2つの不変条件によって定義されます。Right
Height
Width
Width == Right - Left
Height == Bottom - Top
たとえば、MicrosoftがTop
プロパティを書き込み可能にする必要があると判断した場合、さらに1つの設計上の決定を行う必要がありTop
ます。
- 影響
Height
を与えて保存するBottom
、または - 保存
Height
して影響を与えBottom
ますか?
ユーザーが選択できるような「アンカー」プロパティをさらに導入しない限り、Microsoftは、上記の不変条件(2)を保証するために、これらの結果の1つを決定する必要があります。
明らかに、彼らは2つの選択肢のうちの後者を決定しました。次に、Microsoftは彼らの決定を文書化する必要があったでしょう。Top
彼らはMSDNリファレンスページで調整の結果について言及することができます...そして彼らはまさにそれをしたことがわかりました:
Height
およびTop
プロパティ値に変更を加えると、コントロールのプロパティBottom
値が変更されます。—プロパティのMSDNリファレンスページの備考セクションControl.Top
...または、プロパティを読み取り専用として宣言して、このプロパティが他の2つ(および)Bottom
に依存していることをプログラマーに示唆することもできます...これも実行しました:Top
Height
この
Bottom
プロパティは読み取り専用のプロパティです。Top
またはプロパティの値を変更することで、このプロパティ値を操作できHeight
ます[...] —プロパティのMSDNリファレンスページの備考セクションControl.Bottom
そのため、彼らは(任意の)設計上の決定を英語とさらにコードの両方で文書化しました。
Eric Lippert の言葉を引用すると、「あなたは「なぜ?」という質問をし続けますが、あなたの質問はひそかに「なぜ?」の質問であるため、答えるのが難しいと思います。つまり、あなたが本当に聞きたい質問は、「私は[機能] が明らかにどのように設計されるべきかという概念。なんでそうじゃないの?」
「どうして?」の答え。質問はおそらく次のとおりです。
- この「機能」(設定可能な Bottom および Right プロパティ) は提案されていません/有用とは見なされていませんでした
- 設定可能な右と下の動作があいまいです。問題のコントロールのサイズを変更するか (高さ/幅を変更する)、または位置を変更しますか (上/右を変更します)。ここでの「正しい」動作については、人によって意見が異なります。
Bottom
とは計算されるためRight
、たとえば Bottom のように操作する
Bottom = 100
と に変換され(Top + Height) = 100
ます。そのアクションはあいまいです。コントロールの高さを変更したかったのですか、それとも再配置したかったのですか?
座標系は左上の方向に基づいているためです。(0,0) は画面の左上隅であり、位置に基づくすべての測定値は (0,0) を基準としています。左上の座標を設定すると、位置という意味が明確になります。ただし、右下の座標は、高さと幅も含まれているため、よりあいまいです (前述のとおり)。
Right プロパティに 5 を足すとどうなるでしょうか? 場所が変わるのか、それとも幅が変わるのか。これは、有用または意味のある機能ではありません。
編集:
左と上がサイズ変更に関与していない場合、なぜ下と右が必要なのですか?
座標系は右下ではなく左上の方向に基づいているためです。GDI、またはコントロールを描画するために使用しているシステムは、ユニバーサル原点 (0,0) とその原点に相対的なコントロール上の 1 つの点に基づいて位置を計算します。ユニバーサル原点は画面の左上隅であるため、位置を示すポイントとしてコントロールの左上隅を使用するのが最も理にかなっています。
次の 2 つのシナリオを想像してください。
シナリオ 1 - コントロールは右下の座標を計算せず、実際にそれらの座標を格納します。GDI はコントロールを描画する準備ができています。左上の座標は (10,10)、高さは 10、幅は 10、右下の座標は (25,25) に設定されています。コントロールはどのように描画する必要がありますか?
シナリオ 2 - 右下の座標を計算するのではなく、高さと幅が計算されます。左上は (20,20) に設定され、右下は (10,10) に設定されます。コントロールはどのように描画する必要がありますか?
プログラマーを左上と高さ/幅に制限することで、上記のシナリオは決して発生せず、処理時間と偶発的なエラーを節約できます。
Right
によって決定されるためLeft+Width
、Bottom
によって決定されTop+Height
ます。
Left
、Top
、Width
、およびを使用して、Height
コントロールを効果的に配置できます。
プロパティは理論的には設定可能ですが、そうすると問題が多すぎると考えたのでしょう。
Right
基盤となるアーキテクチャはandをサポートしていないため、Bottom
それらを単に計算されたプロパティにするのはおそらく便利すぎるでしょう。
わかりました、告白します、私は推測しています。私が見ることができる明確な理由はありません。これについては、.NET 開発チームに連絡する必要があるかもしれません。
のサイズまたは位置を変更する場合は、 Control.LocationおよびControl.SizeプロパティControl
を変更できます。およびプロパティは、これらの他のプロパティから計算されると思います。Control.Bottom
Control.Right