Как я могу контролировать расположение диалогового окна при использовании ShowDialog для его отображения?

Это очень тривиальная проблема, но я не могу найти способ ее решить. Меня это раздражает, потому что я чувствую, что должен знать ответ на этот вопрос, но я либо ищу неправильные термины, либо смотрю не те методы и свойства.

У меня есть диалог конфигурации, который вызывается из двух мест.

Первый - от кнопки на форме, которая работает правильно - как и следовало ожидать.

Второй - из контекстного меню notifyIcon на панели задач, но здесь он отображается в верхнем левом углу экрана. В идеале я бы хотел, чтобы он отображался по центру основного экрана или, возможно, рядом с системным лотком.

  • Я пробовал установить Location, но, похоже, это отменяется при вызове dialog.ShowDialog().

  • Я пробовал использовать dialog.ShowDialog(IWin32Window) перегрузку, но мне не понравилось, что я передаю null в качестве дескриптора окна.

  • Я пробовал использовать вместо этого dialog.Show(), но (и здесь я могу ошибаться) установка местоположения не дает последовательных результатов.

  • Я даже пробовал установить свойство dialog.Parent, что, конечно, вызвало исключение.

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

Спасибо за ответы - как я и подозревал, это было очевидно, но, как обычно, я застрял и искал неправильный путь. Еще более досадно то, что я тоже использовал это свойство дизайнера.


person ChrisF    schedule 15.06.2009    source источник
comment
Была такая же проблема. Для меня это сработало, чтобы установить местоположение во время события загрузки   -  person TomB    schedule 26.03.2015


Ответы (3)


Вы можете установить для свойства Form.StartPosition значение FormStartPosition.Manual, а затем установите для свойства Form.Location желаемое местоположение. Когда вы звоните ShowDialog, форма должна появиться в желаемом месте.

MyForm frm = new MyForm();
frm.StartPosition = FormStartPosition.Manual;
frm.Location = new Point(10, 10);
frm.ShowDialog();
person heavyd    schedule 15.06.2009
comment
System.Drawing.Point - полное имя класса Point - person Argeman; 12.08.2015

Я предполагаю, что вы используете форму, и в этом случае вы можете использовать перечисление Form.StartPosition. Подробнее об этом можно узнать здесь и поведение перечисления здесь.

person micahtan    schedule 15.06.2009

Попробуйте использовать свойство StartPosition в форме.

person Max Schmeling    schedule 15.06.2009