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