C# 如何使用代码设置Windows窗体的起始位置?

C# 如何使用代码设置Windows窗体的起始位置?,c#,.net,winforms,C#,.net,Winforms,是否有方法使用代码设置Windows窗体的起始位置?似乎无论我尝试什么都会导致startPost成为默认设置 以下是我在表单中要显示的内容: public DealsForm() { InitializeComponent(); this.StartPosition = FormStartPosition.CenterParent; } 下面是我显示表单的步骤: private void nvShowDeals_LinkClick

是否有方法使用代码设置Windows窗体的起始位置?似乎无论我尝试什么都会导致startPost成为默认设置

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

    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()。。。但是我真的不想把它显示为一个对话框。

我的第一反应是:用VS2008做一点实验。它应该位于“常规属性”屏幕中

如果没有VisualStudio,那么它会变得更难

要检查的好站点可能是:


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

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

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);
}
尝试将其置于InitializeComponent()之前。InitializeComponent之后可能已经太晚了(表单可能已经启动,StatPosition设置得太晚)

更新 我刚刚写道:

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


在一个VS项目(全新的)中,当我在Frim2中点击一个按钮时,它会在屏幕中间打开表单。您也可以对Parent…

执行同样的操作。我建议您检查DealsForm.Designer.cs并删除其中设置StartPosition的行,然后按原样执行

或者,可以尝试在窗体的加载或显示事件中设置它

如果我执行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);
}
在这里,我将做以下更改:

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

也许你并不孤单。也许你不是疯子。阅读以下内容(Microsoft Connect客户反馈):

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


MS:“不幸的是,我们将无法在未来的版本中修复此特定问题,因为这里的修复将是对WinForms 1、1.1和2行为的突破性更改”

以家长为中心进行.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;

您可以通过在Form\u Load事件中调用this.CenterToParent()来实现这一点(当父对象实际已知时)。不要在构造函数中调用它,因为调用Show(form)时会设置它的父级

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

我知道这条线索很旧,但可以很容易地回答,所以希望能帮助遇到它的其他人找到简单的解决方案。

我尝试了这个。。。不起作用。。。你会认为这么简单的东西很容易实现,这只是一个何时调用属性的问题,非常确定。我本想帮你,尝试一个简单的解决方案,但你投票否决了我,所以忘了我的帮助。祝你有愉快的一天。我没有投票否决你。。。事实上我刚刚投了你的票来对付那些投你反对票的人。@Daok你实际上不会帮助别人,因为有人投了你的反对票:|当你开始帮助别人,你试图做一个小项目来找到解决方案时,你就投了反对票。我试过这个。。。不起作用。。。你会认为这么简单的事情很容易实现。你是对的。。。我认为唯一一次不会被忽视的是它是否是和MDI儿童。这是一个好的,合理的问题。请投赞成票。0不是此的正确值。。。