Лучшие практики. Как закрыть главную форму из дочерней?
1 - не обязательно делать "логин" главной формой. можно стартовать главную форму скрытой, а форму логина дочерней, но показывать раньше, и дальше действовать в зависимости от успешности логина
2 - конкретно в WinForms можно отрабатывать вообще разные формы последовательноusing System;
using System.Windows.Forms;

namespace X
{
    internal static partial class Y
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(A = new fmA());
            // bla-bla-bla with login
            Application.Run(B = new fmB());
        }
        internal static fmA A;
        internal static fmB B;
    }
}
3 - для WPF не подскажу, но наверняка оба подхода можно рассмотреть и пробовать искать аналогии
ps для WinForms Как закрыть главную форму из дочерней? буквальный ответ - ни как, закрытие главной формы, это завершение Application.Run(A = new fmXXX()); и если вы не модифицирутете код Main- тогда это завершение программы
Я делал вот так private void Login_Click(object sender, RoutedEventArgs e)
{
      this.Hide();
      MainPage mp = new MainPage();
      mp.Show();
}