2

私は、フォームを一連のモーダル ウィンドウとして表示するアプリに取り組んでいます。すべてのフォームが画面の中央に配置されます。ユーザーが画面上でフォームを移動すると、一番上の 1 つだけが移動し、他のフォームは中央に残り、一番上のダイアログによってブロックされるため、移動できません。

すべてのフォームを新しい場所に移動するフォーム移動コードと、現在の中央以外の場所で新しいフォームを開くコードをコーディングしようとしています。

しかし、後者を実行すると奇妙なことが起こります - 他のフォーム (一番下のフォーム) の Location を使用して、中央以外の位置に新しいフォームを開きます。フォームの Location プロパティをプログラムで設定すると、サイズが変更され、フォームが小さくなります。その Size プロパティは、Designer GUI で設定されている (240, 320) から、Designer で生成されたコードにある小さい ClientSize (234, 294) に変更されます。この問題を参照しているネット上の投稿は 1 つしか見つかりませんでしたが、それに対する回答はありません。Location プロパティをそのままにしておくと、フォームは元のサイズで正しく表示されます。

フォームの StartPosition は Manual に設定され、FormBorderStyle は FixedSingle に設定され、AutoScaleMode は DPI または Font のいずれかです (これを設定する方法がわかりません)。

何か案は?ありがとう。

4

1 に答える 1

3

私は自分の質問に答えます。この動作は、OS によってフォームがまだ形成されていないときに Location プロパティを設定したことが原因のようです。つまり、ハンドルがまだ作成されておらず、IsHandleCreated が False です。私は .NET コード自体にデバッグしましたが、「CreateHandle の前にこれを使用しないでください」などの Debug.Assert 呼び出しが、問題のあるコードの周りのコール スタックのどこかに assert パラメーターとしてありました。これが最初のヒントになりました。

コードを Form.Load イベントのイベント ハンドラーに配置すると、問題が解決しました。Load が起動した時点で、ハンドルは既に作成されており、すべてが機能しているように見えます。

原因がわかったので、「コンストラクターとロード イベント ハンドラーの初期化」についてネットを少し検索しました。関連する議論は、ロードまでコントロールの処理を延期する必要があることを示唆しています。.NET コントロールは OS の外側のエンティティのラッパーであるため (そして、それらを使用できるように作成する必要があるため)、これは理にかなっていますが、同時に Designer コードはハンドルは問題なく作成されます。それが何か意味があるなら..

TLDR: Form.Load イベントが発生するまで、コントロールへのアクセスと使用を延期します。

于 2009-10-08T10:13:49.117 に答える