我一直将我的C#/ .NET 2.0项目移植到Mono上以便在其他平台上使用,但这似乎在NATIVE WinForms实现中引发了一个问题。
我已将问题隔离到Control的(特别是Button)Anchor属性与它的Location属性的Y-component之间的关系。当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中保持相同的大小。
答案 0 :(得分: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();
当固定在底部时,按钮只跟随下边框的变化。