如何使用代码设置Windows窗体表单的StartPosition?

时间:2008-10-22 13:34:23

标签: c# .net winforms

有没有办法使用代码设置Windows窗体表单的StartPosition?似乎无论我尝试什么导致Star​​tPostion成为默认值。

以下是我在要显示的表单中所做的事情:

    public DealsForm()
    {
        InitializeComponent();
        this.StartPosition = FormStartPosition.CenterParent;
    }

以下是我要显示表单的内容:

    private void nvShowDeals_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        DealsForm frm = new DealsForm();

        frm.DataSource = this.Deals;

        frm.Show(this);
    }

我尝试在上述每种方法中加入以下内容,但无济于事:

this.StartPosition = FormStartPosition.CenterParent;

如果我通过属性编辑器进行设置......它可以很好地工作,但我会真的喜欢通过代码来完成它。

应该是一个明智的选择......但对于我的生活,我似乎无法弄明白......也许我需要更多的咖啡因。

更新

如果我做了一个ShowDialog()并传递了它的父作品......但我真的不想把它显示为对话框。

8 个答案:

答案 0 :(得分:18)

也许你并不孤单。也许你不是疯了。阅读本文(Microsoft Connect客户反馈):

Windows Form StartPosition property only works for .ShowDialog method and not for .Show method

客户:“Windows Form StartPosition仅适用于.ShowDialog方法,而不适用于.Show方法。注意:我还附加了简单的代码和结果图像。”

MS:“不幸的是,我们无法在将来的版本中修复此特定问题,因为此处的修复将是对WinForms 1,1.1和2的行为的重大改变”

答案 1 :(得分:11)

  

如果我做一个ShowDialog()并通过   它运作的父母......但我真的没有   想把它显示为对话框。

这是正确的,因为ShowDialog会设置frm.Parent == nvShowDeals.Parent
因为你使用.Show()然后frm.Parent == null因此忽略了FormStartPosition.CenterParent。

为了完成这个功能,我会做出以下改变:

public DealsForm()
{
    InitializeComponent();
    //this.StartPosition = FormStartPosition.CenterParent;
}

//DealsForm_Load Event
private void DealsForm_Load(object sender, EventArgs e)
{
    this.Location = this.Owner.Location;  //NEW CODE
}

在这里,我会做出以下更改:

private void nvShowDeals_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    DealsForm frm = new DealsForm();

    frm.DataSource = this.Deals;
    frm.StartPosition = FormStartPosition.Manual; //NEW CODE
    frm.Show(this);
}

答案 2 :(得分:6)

您可以通过在Form_Load事件中调用this.CenterToParent()(实际知道父级)来执行此操作。不要在构造函数中调用它,因为它在调用Show(form)时设置了它。

private void myForm_Load(object sender, EventArgs e)
{
    CenterToParent();
}

我知道这个帖子已经老了,但很容易回答,所以希望能帮助遇到它的人找到简单的解决方案。

答案 3 :(得分:4)

以.Show调用的父对象为中心,这就是我必须做的事情:

childForm.Location = new Point(
    (parentForm.Location.X + parentForm.Width / 2) - (childForm.Width / 2), 
    (parentForm.Location.Y + parentForm.Height / 2) - (childForm.Height / 2));
childForm.StartPosition = FormStartPosition.Manual;

答案 4 :(得分:1)

您是否尝试在调用方法中设置属性?

private void nvShowDeals_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    DealsForm frm = new DealsForm();

    frm.DataSource = this.Deals;

    // Insert this
    frm.StartPosition = FormStartPosition.CenterParent;

    frm.Show(this);
}

答案 5 :(得分:1)

public DealsForm()
{
    InitializeComponent();
    this.StartPosition = FormStartPosition.CenterParent;       
}

尝试将它放在InitializeComponent()之前。在InitializeComponent之后可能已经太晚了(表单可能已经启动并且StatPosition设置得太晚了。)

更新

我刚刚写道:

public Form1()
{
    InitializeComponent();
    this.StartPosition = FormStartPosition.CenterScreen;
}

private void button1_Click(object sender, EventArgs e)
{
    Form1 f = new Form1();
    f.Show();
}

在VS项目(全新)中,当我点击我的form2按钮时,它会打开屏幕中间的表单。您也可以使用Parent ...

答案 6 :(得分:0)

我建议检查您的DealsForm.Designer.cs并删除在那里设置StartPosition的行,然后按原样执行。

或者,也许尝试在表单的“加载”或“显示”事件中设置它。

答案 7 :(得分:-3)

我的第一反应是:用VS2008进行一些实验。它应该在常规属性屏幕中。

如果你没有Visual Studio,那就更难了。

要检查的好网站可能就是这个:csharp-online.net

很抱歉,我无法提供更多帮助