我正在尝试将一个以系统托盘开头的Windows应用程序作为NotifyIcon
,然后根据事件和用户输入显示一些表单。
我正在使用Visual Studio 2013
所以我做的是删除默认表单VS创建并从Application.run()
删除Program.cs
并执行Application.run(new MyApplicationContext())
其中MyApplicationContext
是一个扩展{{1}的类}我初始化并显示ApplicationContext
然后我创建了一个woker线程,用于查询数据库以获取信息,并尝试在我创建的NotifyIcon
中显示该信息。
如果我在woker线程代码中执行类似的操作:
NotificationForm
通知显示在默认位置,其上的任何UI元素都显示为透明,我可以看到桌面
但是,如果我在工作线程中调用NotificationForm form = new form();
form.Top = // change the location;
form.show();
,则表单正常工作并显示在正确的位置,但它会阻止我的工作线程。
如果我有Application.run(form)
,我会在Form
上致电Invoke
。但在我的情况下,我该怎么办?
编辑:作为一种解决方法,我在Form
中发起了一个名为Form
的{{1}},然后在其上显示了show,然后将其隐藏起来。然后我从那里调用。但这似乎是一个肮脏的工作而不是正确的工作;
答案 0 :(得分:-1)
BackgroundWorker _backgroundWorker;
private void Init()
{
_backgroundWorker = new BackgroundWorker();
_backgroundWorker.WorkerReportsProgress = true;
_backgroundWorker.ProgressChanged += _backgroundWorker_ProgressChanged;
_backgroundWorker.DoWork += _backgroundWorker_DoWork;
_backgroundWorker.RunWorkerAsync();
}
private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundWorker = sender as BackgroundWorker;
Thread.Sleep(5000);
backgroundWorker.ReportProgress(0);
Thread.Sleep(5000);
backgroundWorker.ReportProgress(10);
}
private void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Form form = new Form();
form.Text = "Percentage:" + e.ProgressPercentage.ToString();
form.Show();
}
我没有测试它,但它可能会那样。