Закрыть форму без выхода приложения - PullRequest
7 голосов
/ 09 августа 2010

Я сейчас работаю над небольшим проектом и хотел бы получить некоторую помощь по нему.

У меня есть 2 формы, первая - окно входа в систему, а вторая - основная программа. У меня проблема в том, что когда я закрываю form1 с this.Close(), он выходит из всей программы.

У меня такое ощущение, что мне нужно использовать многопоточность или что-то подобное, но я не могу найти подходящий ресурс для решения моей проблемы.

Спасибо.

Ответы [ 6 ]

6 голосов
/ 09 августа 2010

Вы можете скрыть первую форму вместо того, чтобы закрывать ее:

this.Hide();
Form2 form2 = new Form2();
form2.Show();
3 голосов
/ 09 августа 2010

Не можете ли вы изменить свой program.cs так, чтобы он запускал основную форму, и при запуске основной формы он создает и показывает форму входа в систему, а затем прячется (ожидая, пока произойдет вход в систему)

2 голосов
/ 09 августа 2010

Program.cs, где ваша основная функция.Если вы создали проект как приложение Windows с Visual Studio, в main будет функция, которая запускает форму, которая открывается при запуске программы.Просто получите информацию для входа из формы входа в main и затем вызовите второе окно.Вот пример:

[STAThread]
private static void Main(string[] args)
{
    //there's some other code here that initializes the program

    //Starts the first form (login form)
    Application.Run(new form1());

    //Get the login info here somehow. Maybe save in public members of form1 or
    // in a global utilities or global user class of some kind

    //Run the main program
    Application.Run(new mainProgramForm());
}

РЕДАКТИРОВАТЬ: ЗАБЫЛИ ЧТО-ТО

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

private static void Main(string[] args)
{
    //there's some other code here that initializes the program

    //Instead of running a new form here, first create it and then run it
    Form1 form1 = new Form1();    //Creates the form
    Application.Run(form1);       //Runs the form. Program.cs will continue after the form closes

    //Get the login info
    string username = form1.Username;
    string password = form1.Password;

    //Get rid of form1 if you choose
    form1.Dispose();

    //Validate the user info

    //Run the main program
    Application.Run(new mainProgramForm());
}
2 голосов
/ 09 августа 2010

Если вы используете WPF, вы можете установить Application.MainWindow на ваше второе "главное" окно перед закрытием формы входа.

0 голосов
/ 27 июня 2016

Каково ваше мнение, чтобы создать что-то подобное

tray Icon

это называется значок в трее

так что пользователь может close all forms и app still running ,, и user can go back to app any time

позволяет начать кодирование (обратите внимание, это приложение WPF)

private NotifyIcon m_notifyIcon;
private ContextMenuStrip m_contextMenu;
private bool _ForceClose;

public MainWindow()
{
     InitializeComponent();
     CreateNotifyIcon();

}

private void CreateNotifyIcon()
{
    m_contextMenu = new ContextMenuStrip();

    ToolStripMenuItem mI1 = new ToolStripMenuItem { Text = "Open" };
    mI1.Click += (sender, args) => Maximize();
    ToolStripMenuItem mI2 = new ToolStripMenuItem { Text = "Exit" };
    mI2.Click += (sender, args) => EndApplication();
    m_contextMenu.Items.Add(mI1);
    m_contextMenu.Items.Add(mI2);
    //Initalize Notify Icon
    m_notifyIcon = new NotifyIcon
    {
        Text = "Application Title",
        Icon = new Icon("Icon.ico"),
        //Associate the contextmenustrip with notify icon
        ContextMenuStrip = m_contextMenu,
        Visible = true
    };
}

и у нас есть эти функции

protected void Minimize()
{
    Hide();
}

protected void Maximize()
{
    Show();
    this.WindowState =WindowState.Normal;
}

protected void EndApplication()
{
    Minimize();
    Thread.Sleep(1000);
    _ForceClose = true;
    WindowState = WindowState.Normal;
    this.Close();
    Environment.Exit(0);
}

и Window Closing прослушиватель событий (не забудьте добавить его)

private void Window_Closing(object sender, CancelEventArgs e)
{
    if (_ForceClose == false)
    {
        e.Cancel = true;
        Minimize();
    }
}

Вот и все, надеюсь, это поможет вам

0 голосов
/ 09 августа 2010

Откройте Program.cs - вы можете сделать немало перед запуском вызова в Приложение, включая отображение информации для входа в систему.Вот пример из одного из моих проектов.Он пытается найти соединение с базой данных.Если это невозможно, он открывает мастер и подключается к access или mssql.Если открытие хорошее, оно показывает экран spalsh и, наконец, запускает приложение, иначе оно закрывается.

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
DialogResult LclResult;

EESDatabasePersistentData LclPersist;
LclPersist = new EESDatabasePersistentData();
string LclDataType;
string LclDatabase;
string LclServer;
string Password;
string UserID;
if (!LclPersist.GetConnection(out LclServer, out LclDatabase, out LclDataType, out UserID, out Password))
{
        // Run the connection wizard
        GetConnection(out LclServer, out LclDatabase, out LclDataType, out UserID, out Password);
}


if (LclDataType == "ACCESS")
        InitDataAccess(LclDatabase);
else if (LclDataType == "SQLSERVER")
        InitDataSQL(LclServer, LclDatabase, UserID, Password);
if (OpenGood)
{
        if (!System.Diagnostics.Debugger.IsAttached)
        {
                FormSplash.Instance.SetupVersion();
                ///////////////////////////////////
                // If we don't call do events 
                // splash delays loading.
                Application.DoEvents();
                FormSplash.Instance.Show();
        }
        Application.DoEvents();

        Application.Run(new FormMentorMain());
}
else
        Application.Exit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...