Я перенес свой проект C # / .NET 2.0 на Mono для использования на других платформах, но, похоже, это вызвало проблему в реализации NATIVE WinForms.
Я выделил проблему насвязь между свойством Anchor элемента управления (в частности, Button) и 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.