2013-06-28 8 views
13

Я пытаюсь установить расположение формы при вызове на .Show(). Проблема в том, что, поскольку я использую .Show вместо .ShowDialog, значение StartPosition не работает. Я не могу использовать .Showdialog, так как я хочу, чтобы программа выполняла работу в фоновом режиме, показывая форму.Настройка формы при вызове Form.Show()

Когда я создаю форму я установить его местоположение на фиксированное значение:

using (ConnectingForm CF = new ConnectingForm()) 
{ 
    CF.Show(); 
    CF.Location = new Point(this.ClientSize.Width/2, this.ClientSize.Height/2); 
} 

Но когда я запускаю код самой формы места на разных позициях каждый раз, когда я начинаю его.

Любые решения? (Местоположение никогда не устанавливается нигде по моему коду)

+0

Надеюсь, внизу ссылка имеет исправление. Http: // StackOverflow.com/вопросы/21171764/инструкции для открытия-открытия-формы-сверху-слева-в-в-о-о-окна – user2852008

ответ

8

С некоторой помощью от других потоков я нашел рабочий раствор:

using (ConnectingForm CF = new ConnectingForm()) 
    { 
     CF.StartPosition = FormStartPosition.Manual; 
     CF.Show(this); 
     ...... 
    } 

О событии загрузки новой формы в:

private void ConnectingForm_Load(object sender, EventArgs e) 
    { 
     this.Location = this.Owner.Location; 
     this.Left += this.Owner.ClientSize.Width/2 - this.Width/2; 
     this.Top += this.Owner.ClientSize.Height/2 - this.Height/2; 
    } 

(я не эксперт, так пожалуйста, поправьте меня, если я m wrong) Вот как я интерпретирую проблему и решение: Проблема с самого начала состояла в том, что в стартовом положении первой формы (MainForm) была установлена ​​позиция Windows по умолчанию, которая изменяется при запуске формы. Когда я затем вызываю новую форму (форму соединения), это местоположение не относится к местоположению родителя, а к местоположению (0, 0) (верхний левый угол экрана). Таким образом, я видел, как изменилась позиция MainForms, которая показала, что позиция «Соединительная форма» двигалась. Таким образом, решение этой проблемы состояло в том, чтобы сначала установить местоположение новой формы в местоположение главной формы. После этого я смог установить местоположение в центре MainForm.

TL; DR местоположение новой формы не было относительно местоположения родительской формы, но в фиксированном положении, что я предполагаю, что есть (0, 0)

Я изменил MainForm в положение запуска к исправлено для моего удобства. Я также добавил событие, чтобы убедиться, что позиция новых форм всегда была центром MainForm.

private void Location_Changed(object sender, EventArgs e) 
    { 
     this.Location = this.Owner.Location; 
     this.Left += this.Owner.ClientSize.Width/2 - this.Width/2; 
     this.Top += this.Owner.ClientSize.Height/2 - this.Height/2; 
    } 

    private void ConnectingForm_Load(object sender, EventArgs e) 
    { 
     this.Owner.LocationChanged += new EventHandler(this.Location_Changed); 
     this.Location = this.Owner.Location; 
     this.Left += this.Owner.ClientSize.Width/2 - this.Width/2; 
     this.Top += this.Owner.ClientSize.Height/2 - this.Height/2; 
    } 

Надеюсь, это поможет другим людям с той же проблемой!

+0

спасибо Робин, это действительно помогло мне! –

22

StartPosition должен работать нормально с Form.Show. Попробуйте:

ConnectingForm CF = new ConnectingForm(); 
CF.StartPosition = FormStartPosition.CenterParent; 
CF.Show(this); 

Если вы хотите вручную поместить форму, как вы показали, что можно сделать, как хорошо, но все еще требует установив StartPosition свойство Manual:

ConnectingForm CF = new ConnectingForm(); 
CF.StartPosition = FormStartPosition.Manual; 
CF.Location = new Point(this.ClientSize.Width/2, this.ClientSize.Height/2); 
CF.Show(); 

Об одном обратите внимание, что вы не должны использовать оператор using с Form.Show. using вызовет Dispose на форму, которая не нужна, поскольку срок службы формы длиннее этого блока кода.

+0

Следующий код не работает (новая форма находится в верхнем левом углу): 'using (ConnectionForm CF = new ConnectionForm()) { CF.StartPosition = FormStartPosition.CenterParent; CF.Show (this); } ' И' this' действительно является дескриптором для правого родителя. Я использую оператор 'using', чтобы убедиться, что форма расположена правильно. В блоке использования есть больше кода, который я не опубликовал, поскольку он не имеет отношения к позиции формы. – Robin

+0

'using (ConnectionForm CF = new ConnectionForm()) { CF.StartPosition = FormStartPosition.Manual; CF.Show (this); CF.Location = new Point (this.ClientSize.Width/2, this.ClientSize.Height/2); 'Не работает. Расположение форм меняется каждый раз, когда я запускаю приложение. – Robin

+0

Не меняет место на .location и .show – Robin