Nano Hash - криптовалюты, майнинг, программирование

Правильно открывать и закрывать несколько оконных форм в C#

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

Код, который я использую, выглядит так

Form2 secondform = new Form2();

private void aButton_Click(object sender, EventArgs e)
{
    this.Hide();
    secondform.Show();
}

Когда я пытаюсь использовать

this.Close();

вместо

this.Hide();

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

Проблема в том, что после того, как вы вошли в основную программу, единственный способ полностью закрыть программу — это щелкнуть кнопку выхода, которую я разместил там, которая использует

Application.Exit();

Если вы попытаетесь щелкнуть правой кнопкой мыши значок на панели задач и закрыть оттуда или использовать красную кнопку выхода, процесс все равно будет запущен, и его необходимо будет завершить из диспетчера задач.

Что я могу сделать, чтобы приложение корректно закрывалось?


  • Форма, которую вы пытаетесь закрыть, является первой, открытой вашей программой? 27.10.2014

Ответы:


1

Вам следует изменить основную точку входа вашего приложения WinForm, т. е. статический метод Main файла «Program.cs», отобразить форму входа в качестве модального диалогового окна, а затем вызвать Приложение .Run() с экземпляром вашей основной формы. Вот простой пример:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        // Show the login form
        LoginForm loginForm = new LoginForm();
        loginForm.ShowDialog();

        // Show the main form
        Application.Run(new MainForm());
    }
}

class LoginForm : Form
{
    public LoginForm()
    {
        BackColor = Color.Blue;
        Text = "Login Form";
    }
}

class MainForm : Form
{
    public MainForm()
    {
        BackColor = Color.Red;
        Text = "Main Form";
    }
}

Приведенный выше код сначала покажет фиктивную форму входа (синий цвет), а когда она будет закрыта, будет показана основная форма (красный цвет). Код довольно простой, не нужно скрывать и специально закрывать формы и так далее.

27.10.2014
  • Ага! Удивительно, я знал, что есть способ сделать это правильно. Спасибо, form.ShowDialog(); было именно то, что мне было нужно. 27.10.2014

  • 2

    Вы можете попробовать это:

    private void aButton_Click(object sender, EventArgs e)
    {
        this.Hide();
        secondform.Show();
        secondform.FormClosed += new FormClosedEventHandler(sf_FormClosed);
    }
    void sf_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit(); 
    }
    
    27.10.2014

    3

    Вы можете использовать событие form.closing в своей форме с кнопкой выхода. Затем используйте application.close(). Вы также можете указать ссылку вашей формы входа в форму, которую она открывает (вам может понадобиться сделать это в любом случае по другим причинам), затем вы можете использовать глобальную и сохранить форму входа в нее. Затем выполните loginForm.close(), чтобы выйти из приложения.

    27.10.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..