Показать диалоговое окно в центре его родителя

Это был беспорядок, чтобы показать DialogBox в центре его родительской формы. Вот способ показать диалог.

Я позиционирую его родителя по центру, но не могу центрировать диалоговое окно

private void OpenForm(Object point, Object height, Object width)
{
    FormLoading frm = new FormLoading();
    Point temp = (Point)point;
    Point location = new Point(temp.X + (int)((int)width) / 2, 
                               temp.Y + (int)((int)height) / 2);
    frm.Location = location;
    frm.ShowDialog();
}

private void btnView_Click(object sender, EventArgs e)
{
    try
    {                    
        ThreadStart starter= delegate { OpenForm(currentScreenLocation, 
                                                 this.Height, this.Width); };
        Thread t = new Thread(starter);
        t.Start();
        ////// Some functionality here...
        t.Abort();
    }
    catch (Exception)
    {
    }
}

person Tausif Khan    schedule 07.07.2011    source источник
comment
Я также был бы осторожен с многопоточностью. Свойства элемента управления (по крайней мере, те, которые относятся к пользовательскому интерфейсу) могут быть изменены только из потока, в котором они созданы. Я не вижу здесь более широкой картины, поэтому я не знаю, почему вы создаете каждую форму в отдельной ветке, но имейте это в виду.   -  person Kornelije Petak    schedule 07.07.2011


Ответы (4)


Возможно, вы захотите проверить свойство Form.StartPosition.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.startposition.aspx

что-то вроде:

private void OpenForm(Form parent)
{
    FormLoading frm = new FormLoading();
    frm.Parent = parent;
    frm.StartPosition = FormStartPosition.CenterParent;
    frm.ShowDialog();
}

Это, конечно, требует установки родителя формы.

person Kornelije Petak    schedule 07.07.2011
comment
frm.StartPosition = FormStartPosition.Manual; frm.Location = местоположение; Я использовал его и работал на меня :) - person Tausif Khan; 07.07.2011
comment
Установка его в FormStartPosition.CenterParent сделает за вас математику. Но я предполагаю, что вы захотите сохранить свой код, если планируете делать что-то более сложное, чем центрирование. Я рад, что ты решил свою проблему. - person Kornelije Petak; 07.07.2011
comment
FormStartPosition.CenterParent у меня не сработал. Я просто хочу центрировать его. Но ваша предоставленная ссылка была ключом для меня. Спасибо за это - person Tausif Khan; 07.07.2011
comment
frm.Parent = parent; не работает, но удаление этой строки кода по-прежнему работает правильно. Родительская вещь выдает ошибку верхнего уровня, которую невозможно исправить. Top-level control cannot be added to a control - person SSpoke; 03.07.2013
comment
вместо frm.Parent = parent я использую frm.Parent = this - person Jim Lahman; 06.02.2014
comment
Если вы получаете исключение «Элемент верхнего уровня не может быть добавлен...», попробуйте вместо этого установить владельца: frm.Owner = parent; - person Nils Lande; 03.06.2015
comment
Вы также можете передать родительское окно в ShowDialog - person Patrick; 07.02.2018
comment
@Nils +1 за frm.Owner, так как это работает в классе дочерней формы. - person Mooseman; 24.10.2018

form1.StartPosition = FormStartPosition.CenterScreen;

См. http://msdn.microsoft.com/en-us/library/system.windows.forms.form.startposition(v=vs.110).aspx

person user2070102    schedule 13.02.2013

если вы создаете собственный MessageBox, вы можете просто написать это:

CenterToParent();

в вашем пользовательском методе MessageBox formload().

person Mohsen K    schedule 30.01.2018

Кроме того, если вы хотите настроить произвольное местоположение, вы можете использовать это

FormLoading frm = new FormLoading();
Point location = new Point(300, 400);
frm.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
frm.Location = location;
frm.ShowDialog();
person DuyLuc    schedule 26.04.2013