Как установить начальную позицию формы Windows Forms с помощью кода? - PullRequest
16 голосов
/ 22 октября 2008

Есть ли способ установить начальную позицию формы Windows Forms с помощью кода? Кажется, что бы я ни пытался, результаты в StartPostion были по умолчанию.

Вот что я делаю в форме для отображения:

    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 ]

18 голосов
/ 22 октября 2008

Может быть, вы не одиноки. Может быть, вы не безумны. Прочитайте это (Обратная связь с клиентом Microsoft Connect):

Свойство Windows Form StartPosition работает только для метода .ShowDialog, а не для метода .Show

Заказчик: «Позиция Windows Form StartPosition работает только для метода .ShowDialog, а не для метода .Show. Примечание. Я также приложил простой код и изображения результатов.»

MS: «К сожалению, мы не сможем исправить эту конкретную проблему в будущем выпуске, поскольку исправление здесь будет серьезным изменением в поведении WinForms 1, 1.1 и 2»

11 голосов
/ 22 октября 2008

Если я сделаю 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);
}
6 голосов
/ 25 июля 2013

Вы можете сделать это, вызвав this.CenterToParent () в событии Form_Load (когда родитель на самом деле известен). Не вызывайте это в Конструкторе, потому что родительский элемент, который он устанавливает, когда вызывается Show (форма).

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

Я знаю, что эта ветка старая, но на нее можно ответить довольно легко, так что, надеюсь, помогите другим, кто сталкивается с ней, найти простое решение.

4 голосов
/ 23 мая 2012

Чтобы сосредоточиться на родителе для вызова .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;
1 голос
/ 22 октября 2008
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 (совершенно новый), и когда я нажимаю кнопку в форме2, она открывает форму в середине экрана. Вы можете сделать то же самое с Родителем ...

1 голос
/ 22 октября 2008

Вы пытались установить свойство в вызывающем методе?

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);
}
0 голосов
/ 22 октября 2008

Я бы посоветовал проверить ваш DealsForm.Designer.cs и удалить строку, которая устанавливает там StartPosition, а затем сделать это, как вы.

В качестве альтернативы, возможно, вместо этого попробуйте установить его в событиях Load или Shown формы.

0 голосов
/ 22 октября 2008

Моя первая реакция: немного поэкспериментируйте с VS2008. Это должно быть на экране общих свойств.

Если у вас нет Visual Studio, то становится немного сложнее.

Хороший сайт для проверки может быть таким: csharp-online.net

Извините, что я не могу быть более полезным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...