Форма начинает сворачиваться

У меня есть 3 формы - основная форма - Form1, остальные - всплывающая форма, а затем экран входа в систему. Начальный экран отображается первым и заполняет серверы. Затем отображается frmAppLogin, пользователь вводит жестко запрограммированный пароль и результат возвращается в форму form1.

public Form1()
    {
        _assembly = Assembly.GetExecutingAssembly();

        Stream icon = _assembly.GetManifestResourceStream.....

        this.Icon = new Icon(icon);

        Thread t = new Thread(new ThreadStart(SplashScreen));
        t.Start();
        InitializeComponent();
        PopulateServers();
        //Thread.Sleep(800);
        Form frmLogin1 = new frmAppLogin();
        t.Abort();

        frmLogin1.ShowDialog();


        DialogResult res = new DialogResult();
        res = frmLogin1.DialogResult;
        if (res == DialogResult.OK)
        {
            _LoggedIn = true;
        }

        else
        {
            _LoggedIn = false;
        }
 }

Это код для form1_load:

private void Form1_Load(object sender, EventArgs e)
    {
        if (_LoggedIn)
        {
            try
            {
                blah blah........
            }
            catch
            {
                MessageBox.Show("Error accessing resources!");
            }
        }
        else
        {
            this.Close();
        }
    }

И код для формы входа:

public frmAppLogin()
    {
        InitializeComponent();
        this.WindowState = FormWindowState.Normal;
    }


    private void btnAppLogin_Click(object sender, EventArgs e)
    {
        if (txtAppPass.Text.ToString() == requiredPass)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        else
        {
            txtAppPass.Clear();
            txtAppPass.Focus();
            MessageBox.Show("Incorrect Password");
        }
    }

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

Начальная позиция установлена ​​на CenterScreen и WindowState Normal через графический интерфейс.

Также это происходит только тогда, когда я запускаю application.exe в (или копирую его) папке отладки, т.е. не происходит при отладке в Visual Studio 2010.

Редактировать: просто чтобы добавить это, я также попытался:

   private void frmAppLogin_Load(object sender, EventArgs e)
    {
        this.WindowState = FormWindowState.Normal;
    }

Что не помогло.

3 ответа

Решение

Я почти уверен, что вы диагностируете это неправильно. Диалог не сворачивается, он исчезает за окном другого приложения. Обычно Visual Studio, каждый максимизирует его, поэтому он действительно хорош для покрытия других окон. Сверните другие окна, чтобы найти диалог назад.

Что здесь не так, так это то, что в течение доли секунды ваше приложение не имеет окон, на которые Windows может обратить внимание. На самом деле, дважды, между заставкой и формой входа. Снова между формой входа и вашей основной формой. Диспетчер окон Windows вынужден искать другое окно для фокусировки, и, поскольку у вас нет кандидатов, он выберет окно другого приложения.

Оконный менеджер имеет возможность дать приложению время для создания своего первого окна, что неизбежно требует времени. Ваш заставка, без сомнения, портит эту логику. Код не так просто восстановить, как он был опубликован, стандартные приемы вызова кода после вызова ShowDialog() не будут работать, потому что ваше приложение еще не запускает цикл обработки сообщений. Что само по себе является проблемой. Начните решать эту проблему хотя бы с исправления заставки. В.NET уже встроена их надежная поддержка. Ответ здесь.

    t.Start();
    InitializeComponent(); 
    PopulateServers();
    Form frmLogin1 = new frmAppLogin();
    this.Activate(); //This Line will Solve your problem
    t.Abort();

Для тех, у кого возникнет проблема, эта форма всплывает на долю секунды, но сразу минимизируется на панель задач, вот возможное решение:

FormNew f = new FormNew();
f.Owner = this; // - this is the solution line
f.Show();

У меня была такая же проблема с программой, над которой я работал. Вот что я сделал, чтобы обойти это. Кажется, работает хорошо.

В своей основной форме я настраиваю конструктор и StartForm метод следующим образом:

public FrmMain()
{
    Thread thread = new Thread(new ThreadStart(StartForm));
    thread.Start();
    Thread.Sleep(7000);
    InitializeComponent();
    thread.Abort();
}

private void StartForm()
{
    Application.Run(new FrmSplash());
}

Затем в своей основной форме я настраиваю FrmMain_Load событие следующим образом:

private void FrmMain_Load(object sender, EventArgs e)
{
    Activate(); // Give focus to FrmMain and maximize window
}

Готово!

Я знаю, что отвечаю слишком поздно. Я получил ту же проблему и прочитал этот пост и попытался найти решение.

Я создал Timer объект и установить его Interval = 10 и начал Timer на Form Load event, Затем открыл диалоговое окно о событии таймера таймера и остановил таймер и показал login.showDialog(), Он отлично работает для меня. Смотрите код ниже.

        private Timer dispatcher;

        public MainView()
        {
            InitializeComponent();
            frmMdiChildList = new List<Form>();
            Load += new EventHandler(MainView_Load);
            FormClosing += new FormClosingEventHandler(MainView_FormClosing);
            Activated += new EventHandler(MainView_Activated);

        }

        void MainView_Load(object sender, EventArgs e)
        {
            dispatcher = new Timer();
            dispatcher.Interval = 10; //10 milliseconds
            dispatcher.Tick += new EventHandler(dispatcher_Tick);
            dispatcher.Start();
        }

        void dispatcher_Tick(object sender, EventArgs e)
        {
            dispatcher.Stop();
            dispatcher = null;
            showLoginForm();
        }

        private void showLoginForm() {
            Form loginForm = new LoginView();
            loginForm.ShowDialog();
        }
Другие вопросы по тегам