Закрыть модальное диалоговое окно из внешнего потока - C # - PullRequest
9 голосов
/ 18 июня 2009

Я изо всех сил пытаюсь найти способ создать функциональность форм, которую я хочу, используя C #.

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

Как только я вызываю this.ShowDialog(parent), поток программы останавливается, и у меня нет возможности закрыть диалоговое окно без предварительного нажатия пользователем кнопки.

Я пытался создать новый поток с помощью класса BackgroundWorker, но не могу закрыть диалоговое окно в другом потоке.

Я что-то упускаю здесь очевидное?

Спасибо за любую информацию, которую вы можете предоставить.

Ответы [ 4 ]

11 голосов
/ 18 июня 2009

Вам нужно будет вызвать метод Close в потоке, который создал форму:

theDialogForm.BeginInvoke(new MethodInvoker(Close));
11 голосов
/ 18 июня 2009

Использовать System.Windows.Forms.Timer . Установите для свойства Interval время ожидания, а для обработчика события Tick закройте диалоговое окно.

partial class TimedModalForm : Form
{
    private Timer timer;

    public TimedModalForm()
    {
        InitializeComponent();

        timer = new Timer();
        timer.Interval = 3000;
        timer.Tick += CloseForm;
        timer.Start();
    }

    private void CloseForm(object sender, EventArgs e)
    {
        timer.Stop();
        timer.Dispose();
        this.DialogResult = DialogResult.OK;
    }
}

Таймер работает в потоке пользовательского интерфейса, поэтому можно безопасно закрыть форму из обработчика тиковых событий.

3 голосов
/ 22 сентября 2010

Если вы действительно хотите модальный диалог, то я считаю, что это лучшее решение на сегодняшний день: http://www.codeproject.com/KB/miscctrl/CsMsgBoxTimeOut.aspx (прочтите небольшую модификацию в разделе комментариев).

Если вы хотите отображать свою форму модально, то решение от adrianbanks будет лучшим.

1 голос
/ 18 июня 2009

вы можете вызывать закрыть из вашей фоновой нити

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