我的程序有后台程序在读写数据,主窗口UI每秒刷新,然后遇到报警就弹出一个小窗口来显示。
这是我的弹出小窗口代码。现在的问题是弹出来的小窗口不能点击拖动,一碰它就显示未响应死在那儿了。求助应该怎么办。
public static void ShowAlarm(List<Alarm> lstAlarms)
{
if (lstAlarms.Count == 0) return;//lstAlarms是最新的报警,所以不会每秒都来执行后面的程序
var dlg = dlgAlarm.CreateInstance();
StringBuilder sb = new StringBuilder();
foreach (var alarm in lstAlarms)
{
var config = frmMain.lstAlarmConfig.Find(p => p.Id == alarm.AlarmConfigId);
if (config.DialogDisplay == false) continue;
sb.AppendLine("时间 站点 变量 值 报警信息");
alarm._Time = new DateTime(alarm.Time);
sb.AppendLine(string.Format("{0} {1} {2} {3} {4}", alarm._Time.ToString("HH:mm:ss"), alarm.StationName, alarm.TagName, alarm.Value, alarm.AlarmMsg));
}
dlg.textBox1.Text = sb.ToString();
int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
int top = height - 35 - dlg.Height;
int left = width - 5 - dlg.Width;
Point pp = new Point(left, top);
dlg.PointToScreen(pp);
dlg.Location = pp;
dlg.TopMost = true;
dlg.Show();
}
当你调用 ShowAlarm 的时候,应该确保在UI主线程调用它。
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(ShowMessage);
th.IsBackground = true;
th.Start();
}
//非UI线程的操作方法
void ShowMessage()
{
if (this.InvokeRequired)
{
Action<string> Show = (o) =>
{
//非UI线程操作UI控件时的方法写到这里
//...
};
this.Invoke(Show, string.Empty);
}
}