他のプラットフォームで使用するために私のC#/ .NET 2.0プロジェクトをMonoに移植しましたが、これはNATIVE WinForms実装で問題を引き起こしたようです。WinFormsアンカーコントロールは、場所の原点を変更しますか?
私はコントロールの(具体的にはボタン)AnchorプロパティとLocationプロパティのYコンポーネントの関係に問題を切り分けました。 AnchorStyleプロパティがTopに設定されている場合、Locationプロパティの起点はフォームのClientArea(タイトルバーを除く)です。しかし、AnchorをBottomに変更すると、ウィンドウ全体(タイトルバーを含む)の左上隅に原点が変更されます。
は、ここで違いを示し、小さなフォームクラスです:
public class RawCodeForm : Form
{
public RawCodeForm()
{
Button b = new Button();
b.Text = "Test";
b.Location = new Point(10, 10);
b.Size = new Size(75, 23);
b.Anchor = AnchorStyles.Left | AnchorStyles.Top;
//b.Anchor = AnchorStyles.Left | AnchorStyles.Bottom;
this.Controls.Add(b);
this.Size = new Size(100, 200);
this.Location = new Point(100, 100);
this.Show();
}
}
変更は位置で見ることがb.Anchorラインを交換してみてください。
これは文書化されたバグですか?設定する必要がある別のプロパティがありませんか?
編集:フォームがサイズ(300,300)として開始されていることを指摘してくれてありがとう。私はそれが設定されるまで(0,0)であると仮定していた。
上記の単純なテストフォームの外では、後でFormBorderStyleを変更すると、フォームのサイズが変更されるという問題が発生しているように見えます。私の推測では、Mono(またはホストOS)の下で、FormBorderStyleを変更するとClientAreaのサイズが小さくなります。ClientAizeのサイズはネイティブWinFormsで同じサイズのままです。
デフォルトでは、フォームのサイズは300x300です。ボタンを100ピクセルだけ上に移動するように小さくします。これは、デザイナが生成したコードがInitializeComponent()でSuspendLayoutとResumeLayoutを使用する理由です。 –