2012-03-14 65 views
3

我一直在將我的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中保持相同的大小。

+1

按設計,表單的默認大小爲300x300。你把它做得更小,這樣按鈕就會上移100個像素。這就是設計師生成的代碼在InitializeComponent()中使用SuspendLayout和ResumeLayout的原因。 – 2012-03-14 19:03:33

回答

4

這是因爲您在添加按鈕後更改了表單的大小。之前更改它

this.Size = new Size(100, 200); 
this.Location = new Point(100, 100); 

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.Show(); 

該按鈕只是在錨定到底部時更改下邊框。