2

Control.Topとを操作することで、コントロールの下部を揃えることができますControl.Height。そして同様にControl.Right。しかし、.NET がこれらのプロパティを直接変更できないようにしたのはなぜでしょうか? 私がコントロールポジショニングを扱ってきた最後のいくつかのフェイズ以来、それはイライラします。

4

6 に答える 6

7

短い答え:

技術的に必要なためではなく、/または/が変更されたときに再計算されるのはこれらのプロパティであることを文書化する方法として、作成Bottomおよび読み取り専用になっていると思います。RightTopHeightLeftWidth

長い答え:

2つのプロパティセットがあります。1つは絶対座標(、、、Top)用で、もう1つは寸法(、Bottom)用Leftです。これらの間の関係は、次の2つの不変条件によって定義されます。RightHeightWidth

  1. Width == Right - Left
  2. 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に依存していることをプログラマーに示唆することもできます...これ実行しました:TopHeight

このBottomプロパティは読み取り専用のプロパティです。Topまたはプロパティの値を変更することで、このプロパティ値を操作できHeightます[...]プロパティのMSDNリファレンスページの備考セクションControl.Bottom

そのため、彼らは(任意の)設計上の決定を英語とさらにコードの両方で文書化しました。

于 2012-07-06T12:28:02.120 に答える
3

Eric Lippert の言葉を引用すると、「あなたは「なぜ?」という質問をし続けますが、あなたの質問はひそかに「なぜ?」の質問であるため、答えるのが難しいと思います。つまり、あなたが本当に聞きたい質問は、「私は[機能] が明らかにどのように設計されるべきかという概念。なんでそうじゃないの?」

「どうして?」の答え。質問はおそらく次のとおりです。

  1. この「機能」(設定可能な Bottom および Right プロパティ) は提案されていません/有用とは見なされていませんでした
  2. 設定可能な右と下の動作があいまいです。問題のコントロールのサイズを変更するか (高さ/幅を変更する)、または位置を変更しますか (上/右を変更します)。ここでの「正しい」動作については、人によって意見が異なります。
于 2012-07-06T12:16:35.850 に答える
2

Bottomとは計算されるためRight、たとえば Bottom のように操作する Bottom = 100と に変換され(Top + Height) = 100ます。そのアクションはあいまいです。コントロールの高さを変更したかったのですか、それとも再配置したかったのですか?

于 2012-07-06T12:17:15.453 に答える
2

座標系は左上の方向に基づいているためです。(0,0) は画面の左上隅であり、位置に基づくすべての測定値は (0,0) を基準としています。左上の座標を設定すると、位置という意味が明確になります。ただし、右下の座標は、高さと幅も含まれているため、よりあいまいです (前述のとおり)。

Right プロパティに 5 を足すとどうなるでしょうか? 場所が変わるのか、それとも幅が変わるのか。これは、有用または意味のある機能ではありません。

編集:

左と上がサイズ変更に関与していない場合、なぜ下と右が必要なのですか?

座標系は右下ではなく左上の方向に基づいているためです。GDI、またはコントロールを描画するために使用しているシステムは、ユニバーサル原点 (0,0) とその原点に相対的なコントロール上の 1 つの点に基づいて位置を計算します。ユニバーサル原点は画面の左上隅であるため、位置を示すポイントとしてコントロールの左上隅を使用するのが最も理にかなっています。

次の 2 つのシナリオを想像してください。

シナリオ 1 - コントロールは右下の座標を計算せず、実際にそれらの座標を格納します。GDI はコントロールを描画する準備ができています。左上の座標は (10,10)、高さは 10、幅は 10、右下の座標は (25,25) に設定されています。コントロールはどのように描画する必要がありますか?

シナリオ 2 - 右下の座標を計算するのではなく、高さと幅が計算されます。左上は (20,20) に設定され、右下は (10,10) に設定されます。コントロールはどのように描画する必要がありますか?

プログラマーを左上と高さ/幅に制限することで、上記のシナリオは決して発生せず、処理時間と偶発的なエラーを節約できます。

于 2012-07-06T12:18:04.863 に答える
0

Rightによって決定されるためLeft+WidthBottomによって決定されTop+Heightます。

LeftTopWidth、およびを使用して、Heightコントロールを効果的に配置できます。

プロパティは理論的には設定可能ですが、そうすると問題が多すぎると考えたのでしょう。

Right基盤となるアーキテクチャはandをサポートしていないため、Bottomそれらを単に計算されたプロパティにするのはおそらく便利すぎるでしょう。

わかりました、告白します、私は推測しています。私が見ることができる明確な理由はありません。これについては、.NET 開発チームに連絡する必要があるかもしれません。

于 2012-07-06T11:54:59.650 に答える
0

のサイズまたは位置を変更する場合は、 Control.LocationおよびControl.SizeプロパティControlを変更できます。およびプロパティは、これらの他のプロパティから計算されると思います。Control.BottomControl.Right

于 2012-07-06T11:55:06.930 に答える