【发布时间】:2016-06-13 11:20:24
【问题描述】:
我正在创建一个系统托盘应用程序。初始化应用程序后,我想:
- 初始化并加载表单,使其在后台运行
- 但保持表单隐藏(直到用户双击托盘图标)
表单在后台加载和运行很重要,因为表单包含一个嵌入式浏览器,它将初始化一个 Web 套接字连接以接收数据。但它需要隐藏。我尝试通过使用表单的Visible 属性来解决这个问题。到目前为止,我有这个(仅显示相关代码):
public TrayApp()
{
var ni = new NotifyIcon();
InitializeForm();
ni.DoubleClick += this.ShowForm;
}
private void InitializeForm()
{
//load the form in the background so it can start receiving incoming data, but don't actually show the form
myForm = new MyForm();
myForm.Show();
myForm.Visible = false;
}
private void ShowForm(object sender, EventArgs e)
{
myForm.Visible = true;
}
这很好用,除了一个小细节:启动应用程序时,我短暂地看到表单在隐藏之前闪烁。我想Show 方法还将Visible 标志设置为true,从而导致闪存发生。
我尝试过的其他东西,基于 cmets:
- 不要调用
myForm.Show(),只初始化表单。这样可以避免 flash 但不会加载浏览器,因此未初始化 websocket 连接 - 做
myForm.Hide():效果和之前一样 - 在调用
Show()之前将Opacity设置为0,在将Visible设置为false之后将其设置为1:这确实有效,但我希望有一个更清洁的解决方案
如何避免闪现并保持表单运行但隐藏?
【问题讨论】:
-
如果你打电话给
Show或ShowDialog已经来不及隐藏了。你不能避免调用这些方法吗?在有模型的地方使用抽象:创建在后台运行的模型,然后您可以随时创建视图(甚至是多个视图)并将其附加到模型以查看累积或快照状态。在使用了一些 MVVM 之后,将套接字通信放入Form感觉非常错误。 -
试试 myform.Hide();
-
在你的初始化表单中,只是不要通过隐藏它来跟随它,它已经存在一旦你完成了 new MyForm() .. 除非你有一些触发代码在显示 - 你可以运行.. 不显示课程形式
-
也许我对套接字的东西不是很清楚。所以让我澄清一下:表单包含的唯一内容是嵌入式 CEF 浏览器。它是在该浏览器中运行的页面,具有 websocket 连接。除了托管浏览器之外,表单本身不做任何事情因此,保持表单保持打开状态很重要,否则,浏览器和 websocket 连接将被终止。使用 Hide() 将关闭表单并终止连接。
-
如果你想弄脏把戏(假设你必须创建句柄才能工作?我不知道
WebBrowser),然后执行以下操作:将表单大小设置为可能的最小值,显示表格,隐藏它,将大小设置为正常,正常显示。另请参阅this。