WinForms Anchor Control променя произхода на местоположението?

Пренасям проекта си C# / .NET 2.0 към Mono за използване на други платформи, но това изглежда е довело до проблем в внедряването на NATIVE WinForms.

Изолирах проблема до връзката между свойството Anchor на контрола (по-специално, бутон) и Y-компонента на това свойство Location. Когато свойството AnchorStyle е зададено на Top, произходът на свойството Location е ClientArea на формуляра (с изключение на заглавната лента). Промяната на Anchor към Bottom обаче променя произхода до горния ляв ъгъл на целия прозорец (включително заглавната лента).

Ето малък клас Form, който илюстрира разликата:

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 линиите, за да видите промяната в позицията.

Това документиран бъг ли е или пропускам друго свойство, което трябва да бъде зададено?


Редактиране: Благодаря, че отбелязахте, че формулярът започва като Size(300,300). Бях предположил, че е (0,0) до настройката.

Извън простия тестов формуляр по-горе, проблемът сега изглежда е, че FormBorderStyle, който се променя по-късно, кара формуляра да преоразмерява. Моето предположение е, че под Mono (или хост ОС), FormBorderStyle, който се променя, преоразмерява ClientArea по-малък, където - тъй като областта ClientSize остава със същия размер в собствените WinForms.


person Chris    schedule 14.03.2012    source източник
comment
По дизайн размерът по подразбиране на формуляр е 300x300. Правите го по-малък, така че бутонът да се премести нагоре със 100 пиксела. Ето защо генерираният от дизайнера код използва SuspendLayout и ResumeLayout в InitializeComponent().   -  person Hans Passant    schedule 14.03.2012


Отговори (1)


Това е така, защото променяте размера на формуляра, след като сте добавили бутона. Променете го преди

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

Бутонът просто следва промяната на долната граница, когато е закотвен към дъното.

person Olivier Jacot-Descombes    schedule 14.03.2012