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

Я переносил свой проект C#/.NET 2.0 на Mono для использования на других платформах, но, похоже, это вызвало проблему в реализации NATIVE WinForms.

Я изолировал проблему от связи между свойством Anchor элемента управления (в частности, кнопки) и Y-компонентом свойства Location. Если для свойства AnchorStyle задано значение Top, источником свойства Location является ClientArea формы (за исключением строки заголовка). Однако изменение привязки на нижний меняет исходную точку на верхний левый угол всего окна (включая строку заголовка).

Вот небольшой класс 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, чтобы увидеть изменение положения.

Это задокументированная ошибка или мне не хватает другого свойства, которое необходимо установить?


Изменить: спасибо, что указали, что форма начинается с размера (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