4

現在作成中の Windows フォーム アプリケーションのメイン フォームには、左右のパネルを持つ SplitContainer があります。アンカーが右 (または右と左) に設定されている右側のパネルのコントロールは、デザイナーで配置した場所にとどまりません。定期的に、コントロールはピクセルを左にシフトします (実行時ではなくデザイナーで)。左と右の両方に固定されたコントロールの場合、コントロールは縮小しますが、ちょうど右に固定されたコントロールの場合、コントロール全体が同じサイズのまま左に移動します。なぜこれが起こるのか、またはそれを回避する方法を知っている人はいますか? 今、私にできる唯一のことは、それらを定期的に元に戻すことです。

注: 私の Windows フォーム デザイナーは現在、LayoutMode = SnapToGrid、Snap to Grid = true、グリッド サイズ 5 x 5 で設定されています。

編集:最終的に、Visual Studio 2012 でこの問題を再現する方法を見つけることができました。使用しているのと同じデザイナー設定で新しい Windows フォーム プロジェクトを作成し、SplitContainer をフォームに追加します。ドッキングしたままにして埋めます (またはすべての側面にアンカーを使用します)。次に、SplitterDistance を 100 に、SplitterWidth を 5 に設定します。ボタンを右側の SplitPanel に追加し、そのアンカーを Bottom と Right に設定します。ボタンの右端が SplitPanel の側面と同じ高さになるようにボタンを移動し、フォームを閉じてから開きます。魔法のように、ボタンが 1 ピクセル左に移動しました。

閉じる前の状態は次のとおりです (この場合、ボタンの位置は 105、175 です)。 正しく設定されたフォーム

閉じて再度開くと、次のようになります (ボタンの位置は 104、175 です)。 閉じて再度開いた後のフォーム

この例が問題の再現に役立つことを願っています。

4

1 に答える 1

6

右側の SplitPanel にボタンを追加し、そのアンカーを Bottom と Left に設定します。

いいえ、これの再現を取得するには、下と右である必要があります。これは、SplitterWidth 割り当てが原因です。たとえば、ボタンを 2 ピクセル移動するには、6 に設定します。

これは、自動レイアウト計算の避けられない欠陥によって引き起こされます。順序は非常に重要であり、SplitContainer によって実装される ISupportInitialize インターフェイスとの相互作用が不十分です。パネルのレイアウトが最初に計算されますが、デフォルトの SplitterWidth に基づいたサイズのままです。次は SplitContainer で、パネルが広すぎることに気づき、縮小します。これは、ボタンが既に右に固定されているため、パネルが広すぎるのと同じ量だけボタンが移動する原因となります。

このようなレイアウト計算順序の依存関係は一般的であり、設計方法に固有のものです。派生フォームが基本フォーム クラスとは異なるサイズを持つ、継承されたフォーム クラスで特に問題になります。位置がそのサイズに依存する (下または右に固定されている) コントロールは、間違った位置に配置されます。

これには、右に固定しない、デフォルトのスプリッター幅を変更しない、ボタンの位置を自分で計算するなど、さまざまな回避策があります。

于 2013-09-01T14:33:16.953 に答える