Как я могу отключить родительское окно в С#, когда открыто дочернее окно?

У меня есть класс таймера, который я создал, который отслеживает лицензию на программное обеспечение. Когда возникает ошибка, я вызываю ShowDialog(), чтобы показать мою настроенную форму окна. Моя проблема в том, как я могу отключить родительское окно? Вот простой пример моей проблемы. Как вы можете видеть, как только всплывает MessageBox, вы все еще можете печатать из окна MainForm.

Файл MainForm1.cs

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  

namespace TestProject  
{  
    public partial class MainForm1 : Form  
    {  
        public MainForm1()  
        {  
            InitializeComponent();  
        }  

        private void MainForm1_Load(object sender, EventArgs e)  
        {  
            TimerClass1 timer = new TimerClass1();  
        }  
    }  
}  

Файл MessageBox.cs

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  

namespace TestProject  
{  
    public partial class MessageBox : Form  
    {  
        public MessageBox()  
        {  
            InitializeComponent();  
            this.label1.Text = "Hello There";  
            this.button1.Text = "OK";  
            this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;  
        }  
    }  
}  

Файл TimerClass1.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Timers;  
using System.Windows;  

namespace TestProject  
{  
    class TimerClass1  
    {  
        Timer _timer;  
        public TimerClass1()  
        {  
            _timer = new Timer(1);  
            _timer.Elapsed +=new ElapsedEventHandler(_timer_Elapsed);  
            _timer.Enabled = true;  
        }  

        private void _timer_Elapsed(object sender, ElapsedEventArgs e)  
        {  
            _timer.Stop();  
            MessageBox msg = new MessageBox();  
            msg.ShowDialog();  
            _timer.Start();  
        }  
    }  
}  

person user1598995    schedule 14.08.2012    source источник
comment
Возможный дубликат?: stackoverflow.com/questions/1130208/   -  person Rivasa    schedule 15.08.2012
comment
Просто прочитав этот код, я бы сказал, что главное окно не должно отвечать на запросы. Но создание собственного класса MessageBox сбивает с толку.   -  person Henk Holterman    schedule 15.08.2012
comment
Кроме того, почему таймер вызывает окно сообщений? Если вы хотите, чтобы showdialog работал, его следует вызывать из основной формы.   -  person Rivasa    schedule 15.08.2012


Ответы (4)


Вы показываете MessageBox в отдельном потоке, поэтому он не отображается как модальный диалог главного окна. Вам нужно показать это в основном потоке пользовательского интерфейса:

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)  
    {  
        _timer.Stop();  
        Application.Current.Dispatcher.Invoke(new Action(
        () => {
            MessageBox msg = new MessageBox();  
            msg.ShowDialog();  
        }));
        _timer.Start();  
    }  
person Thomas Levesque    schedule 14.08.2012
comment
Или просто используйте более разумный класс Timer. - person Henk Holterman; 15.08.2012

Чтобы исправить это, просто измените следующее:

Файл TimerClass1.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
//using System.Timers;  
using System.Windows;  

а затем исправить ошибки, возникающие при переходе на Windows.Forms.Timer (тот, который вам нужен).

person Henk Holterman    schedule 14.08.2012
comment
Это приложение WPF, а не приложение WinForms; он должен использовать System.Windows.Threading.DispatcherTimer - person Thomas Levesque; 15.08.2012
comment
Хорошо, ответ остается в основном таким же. - person Henk Holterman; 15.08.2012

Вам понадобится какой-то способ доступа к MainForm1 из TimerClass1. Сделав это, вы можете создать и вызвать метод на MainForm1, который отключит саму форму или элементы управления в форме.

person John Fisher    schedule 14.08.2012

Отправка родительской формы в качестве параметра вашему таймеру и отображение диалогового окна, как показано ниже, должно помочь:

Файл MainForm1.cs

TimerClass1 timer = new TimerClass1(this);

Файл TimerClass1.cs

..
private Form ParentForm {get; set;}
..
public TimerClass1(Form parentForm)           
{
..
this.ParentForm = parentForm;
..   
}
..
private void _timer_Elapsed(object sender, ElapsedEventArgs e)           
{
..
 msg.ShowDialog(this.ParentForm);
..
} 
.. 
person danielQ    schedule 14.08.2012