当子窗口打开时,如何在C#中禁用父窗口?

时间:2012-08-14 20:23:37

标签: c# wpf window showdialog

我创建了一个监视软件许可证的计时器类。发生错误时,我调用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();  
        }  
    }  
}  

4 个答案:

答案 0 :(得分:2)

您在单独的线程上显示MessageBox,因此它不会显示为主窗口的模式对话框。您需要在主UI线程上显示它:

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)  
    {  
        _timer.Stop();  
        Application.Current.Dispatcher.Invoke(new Action(
        () => {
            MessageBox msg = new MessageBox();  
            msg.ShowDialog();  
        }));
        _timer.Start();  
    }  

答案 1 :(得分:1)

要解决此问题,只需更改以下内容:

TimerClass1.cs文件

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

然后修复因切换到Windows.Forms.Timer(您需要的那个)而导致的错误。

答案 2 :(得分:0)

您需要一些方法从TimerClass1访问MainForm1。完成后,您可以在MainForm1上创建并调用一个方法,该方法将禁用表单本身或表单上的控件。

答案 3 :(得分:0)

父表单作为参数发送到您的计时器,并显示如下对话框应该可以解决问题:

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);
..
} 
..