0

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

消息框.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

4 回答 4

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();  
    }  
于 2012-08-14T20:29:47.893 回答
1

要修复它,只需更改以下内容:

TimerClass1.cs 文件

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

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

于 2012-08-14T20:30:44.787 回答
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);
..
} 
.. 
于 2012-08-14T20:39:13.427 回答
0

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

于 2012-08-14T20:27:20.913 回答