Расположение формы формы при вызове Form.Show()

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

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

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

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

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

Ответ 1

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

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

(Я не эксперт, поэтому, пожалуйста, поправьте меня, если я ошибаюсь). Вот как я интерпретирую проблему и решение: с самого начала проблема заключалась в том, что первая стартовая позиция формы (MainForm) была установлена в Windows Default Location, которая изменяется при запуске формы. Когда я затем вызвал новую форму (форму соединения), это местоположение не относилось к ее родительскому местоположению, а к местоположению (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;
    }

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

Ответ 2

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 в форме, что нежелательно, так как время жизни формы больше, чем этот блок кода.