我一直在將我的C#/ .NET 2.0項目移植到Mono上以便在其他平臺上使用,但這似乎在NATIVE WinForms實現中引發了一個問題。WinForms錨點控件更改位置的起源?
我已經隔離了控件(特別是Button)Anchor屬性和它的Location屬性的Y組件之間的關係問題。當AnchorStyle屬性設置爲Top時,Location屬性的原點是表單的ClientArea(不包括標題欄)。然後將錨點更改爲底部,但是將原點更改爲整個窗口的左上角(包括標題欄)。
這裏有一個小表格類說明了區別:
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(或主機操作系統)下,被更改的FormBorderStyle調整了ClientArea的大小,因爲ClientSize區域在本地WinForms中保持相同的大小。
按設計,表單的默認大小爲300x300。你把它做得更小,這樣按鈕就會上移100個像素。這就是設計師生成的代碼在InitializeComponent()中使用SuspendLayout和ResumeLayout的原因。 – 2012-03-14 19:03:33