2014-11-23 37 views
0

在我的.NET应用程序中,如果某些任务需要一段时间才能告诉用户程序仍然有效,则显示带有“请稍候”消息的窗体。这个表单必须在自己的线程中运行,因为主线程是工作的人员,因此很忙。 I read that one can use Form.Owner for this task,但我认为这不适用于表单在不同线程上运行。如何使窗体停留在另一个上面

问题是,等待窗体可以隐藏在主窗体后面,在这种情况下,用户看不到它,并且无法将它带到前面,因为它没有任务栏按钮(它是一个“没有一个)。

我的问题是,如果可以让等待窗体保持在主窗体上方而不使其成为AlwaysOnTop窗体(它将停留在所有窗口之上)?

+0

当然,你会得到一个IllegalOperationException。有很多方法可以解决这个问题,但是你可以弄清楚[你的程序为什么会死机](http://blogs.msdn.com/b/dsui_team/archive/2012/10/31/debugging-windows-forms- application-hangs-during-systemevents.userpreferencechanged.aspx),可以在显示该窗口后的*小时*。这是为了吓唬你。使用工作线程执行工作,使用UI线程来显示UI,并且不会有问题。 – 2014-11-23 22:17:18

回答

1

对此,您可以使用Form.TopMost属性。

您也可以使用下面的代码:

protected void SetZOrder(IntPtr bottom, IntPtr top) { 
    const int flags = 0x0002 | 0x0001; 
    NativeMethods.SetWindowPos(bottom, top, 0, 0, 0, 0, flags); 
} 

底部 - 主要形式的指针,顶部 - 等待形式的指针。要获取指针,请使用Form.Handle属性。并通过父窗体的BeginInvoke方法调用SetZOrder。

+0

TopMost使窗体停留在所有窗户之上,但我希望窗体保持在窗户之上。 – Karsten 2014-11-23 21:51:19

+0

我已经更新了我的答案。 – 2014-11-23 22:09:16

+0

当底部窗口的线程繁忙时,它不起作用,但我认为这是我能达到的最佳效果。谢谢! – Karsten 2014-11-24 08:56:25

2

您的主线程不应该在工作。它应该是处理用户界面,没有别的。

执行此操作的正确方法是以异步方式(例如在单独的线程中)执行任何耗时的工作,并将所有用户界面保留在主线程中。然后,您可以通过调用Form.ShowDialog()方法简单地显示“请稍候”消息表单。这将强制关注该对话框并将其保留在其父窗体之上(不要忘记将父窗体引用传递给ShowDialog()方法)。

没有代码示例,我不能确切地说明在特定情况下这将如何显示。但是,一般的想法看起来是这样的:

private void button1_Click(object sender, EventArgs e) 
{ 
    using (Form form = MyWaitMessageForm()) 
    { 
     form.Shown += async (sender1, e1) => 
     { 
      await Task.Run(() => MyLongRunningWork()); 
      form.Close(); 
     } 

     form.ShowDialog(this); 
    } 
} 
+0

.ShowDialog(父级)如果您不希望与父级表单交互,并且.Show(父级)如果您希望能够对父级执行任何操作(例如从文本框复制文本)。 – Wolf5 2014-11-23 22:03:28

+0

由于OP明确要求'等待窗体保持在主窗体之上',所以调用正确的方法是ShowDialog()而不是Show()。 – 2014-11-23 22:09:58

+0

它也保持在Show(父)上方,但父母是可以聚焦的。但是不会出现在子窗口之上。只有两种方法可以做同样的事情,但考虑到不同的用法。它实际上最接近AlwaysOnTop,但仅限于该父窗体(当然需要ShowInTaskbar = false)。 – Wolf5 2014-11-23 22:12:55

1

你可以使用,当你这样做的Form.ShowDialog(IWin32Window)

Form1 testDialog = new Form1(); 
testDialog.ShowDialog(this) 
+0

WinForms对话框在关闭后需要处理。 – 2014-11-23 22:10:39

相关问题