Закрытие «формы» из другой «формы» - PullRequest
4 голосов
/ 11 сентября 2011

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

Я погуглил свой запрос, много обсуждений, но не смог найти то, что я хочу.

Пожалуйста, помогите мне немного.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 11 сентября 2011

Для того, чтобы закрыть форму вам необходимо иметь ссылку на эту форму. Самый простой способ сделать это - добавить новое свойство к объекту Program в вашей программе, которое статично и доступно везде. Просто измените ваш Program.cs файл, чтобы сделать класс Program общедоступным и добавить соответствующую ссылку:

public static class Program
{
    ///This is your splash screen
    public static Form1 MySplashScreen = new Form1();

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        /// This is how you run your main form
        Application.Run(MySplashScreen);
    }
}

Затем в своей форме вы можете легко закрыть форму заставки, используя следующий синтаксис:

Program.MySplashScreen.Close();

РЕДАКТИРОВАТЬ: В WinForms есть только один поток GUI, поэтому, пока вы выполняете закрытие из другой формы, это должно быть безопасно. Если вы хотите закрыть форму из рабочего потока, созданного в графическом интерфейсе, используйте следующий код (это должно ссылаться на вашу вторую форму):

this.Invoke((MethodInvoker)delegate {
            Program.MySplashScreen.Close();
});
3 голосов
/ 11 сентября 2011

Пока у вас есть какая-либо ссылка на первую форму, вы вызываете метод Close() в другой форме.Поэтому, когда вы создаете вторую форму, дайте ей ссылку на заставку.Затем присоедините обработчик к событию Shown и вызовите close на экране-заставке.

Чтобы обойти проблему с несколькими потоками, вам необходимо создать метод с именем что-то вроде ThreadSafeClose и определить его, как показано ниже.Затем вызовите этот метод вместо .Close()

public void ThreadSafeClose() {
        if(this.InvokeRequired) {
            this.Invoke(new MethodInvoker(this.Close));
        }
    }
1 голос
/ 11 сентября 2011

Обычно вам не нужна новая тема. Но как только вы это сделаете, вы можете сделать это, разделив значение bool (назовите его closeSplash) между двумя потоками.

Поместите таймер в форму-заставку, чтобы проверять значение closeSplash каждую секунду. Когда closeSplash имеет значение true, просто вызовите метод Close () формы Splash.

См. это , если вы решите закрыть заставку из другого потока.

0 голосов
/ 11 сентября 2011

Вы не нуждаетесь в отдельном потоке, чтобы отобразить «заставку» за определенный период времени.На самом деле, есть лучшие способы создать классы, чтобы сделать это намного проще.Не использовать таймер здесь или использовать отдельные потоки для этого не является правильным решением ИМХО.Я предлагаю вам попробовать сделать что-то вроде этого:

public class SplashScreen : Form
{
    // add a timer to your form with desired interval to show

    protected override void OnShown(EventArgs e)
    {
        displayTimer.Start();
        base.OnShown(e);
    }

    private void displayTimer_Tick(object sender, EventArgs e)
    {
        this.Close();
    }
}

public class MainForm : Form
{
    protected override void OnLoad(EventArgs e)
    {
        // splash screen will be shown before your main form tries to show itself
        using (var splash = new SplashScreen())
            splash.ShowDialog();
        base.OnLoad(e);
    }
}
0 голосов
/ 11 сентября 2011

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

public static SplashForm splashInstance;

Затем в конструкторе для формы всплеска вы можете присвоить значение «this».

SplashForm.splashInstance = this;

Теперь вы можетевызовите SplashForm.splashInstance.Close () из любой точки вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...