Показать новое дочернее окно из другого дочернего окна, но отцентрировать его в родительском окне - PullRequest
0 голосов
/ 20 октября 2011

У меня есть приложение winforms с основной формой (fMain) и двумя дочерними формами (fLogin и fAdmin). fLogin отображается с использованием этого кода, который находится в обработчике события нажатия кнопки для кнопки в главной форме:

// show login form; pass the main form in as an argument
fLogin formLogin = new fLogin(this);
formLogin.StartPosition = FormStartPosition.CenterParent;
formLogin.ShowDialog(this);

В конструкторе для fLogin я назначаю основную форму закрытой переменной уровня члена.

// fLogin
fMain _mainForm;

// fLogin constructor
public fLogin(fMain mainForm)
{
    InitializeComponent();
    _mainForm = mainForm;
}

Как вы можете себе представить, fLogin - это небольшая форма с текстовыми полями для имени пользователя и пароля и парой кнопок. Когда мои пользователи вводят свои учетные данные и нажимают кнопку OK, fLogin проверит информацию на сервере, и если информация верна, fLogin исчезнет и отобразится fAdmin. В настоящее время я отображаю fAdmin следующим образом:

// hide formLogin right away
this.Hide()

// show admin form
fAdmin formAdmin = new fAdmin();
formAdmin.StartPosition = FormStartPosition.CenterParent;
formAdmin.Show(_mainForm); // pass main form as owner of admin form

// close formLogin
this.Close();

Я не могу установить formAdmin.Parent = _mainForm и заставить диалог магически центрировать себя. Поэтому я передаю _mainForm в formAdmin.Show () как владелец formAdmin, но это, похоже, не помогает в отношении центрирования formAdmin. Есть ли простой способ заставить formAdmin отображаться в центре главной формы?

1 Ответ

1 голос
/ 21 октября 2011

Я думаю, вам нужно немного реструктурировать то, как вы это делаете, вместо того, чтобы отображать fAdmin из fLogin, закрывать fLogin и затем открывать fAdmin из fMain.Если это не работает, вы можете центрировать вручную, рассчитав точку для верхнего левого угла fAdmin и установив эту точку как местоположение fAdmin.Я должен был сделать это в прошлом, когда сталкивался с подобными проблемами.Чтобы вычислить верхний левый угол для fAdmin, чтобы он был отцентрирован на fMain, используйте следующее:

Point p = new Point(0, 0);
p.Y = (fMain.Height / 2) - (fAdmin.Height / 2);
p.X = (fMain.Width / 2) - (fAdmin.Width / 2);
fAdmin.Location = p;
...