如何将引用类型传递给Control.Invoke /显示以主窗体为中心的窗体

时间:2010-06-03 07:52:15

标签: c# winforms asynchronous

我在UI线程以外的线程上,需要显示一个以应用程序主窗体为中心的模式窗体。我通常做的是使用主窗体的宽度和高度以及模态窗体来计算位置,然后使用主窗体的PointToScreen方法来获取模态窗体的位置。因为我在另一个线程上,我需要使用Control.Invoke来调用此方法。我只是无法弄清楚如何将Point类型的参数传递给Control.Invoke(params object [])。值类型和字符串工作正常。

,如果有人能找到一种更好的方式来显示以主要形式为中心的表单而不管线程,那就太棒了。 MessageBox似乎能够做到这一点(虽然不是模态)。

修改

调用这样的东西我没问题。

mainform.Invoke(..., object[] { someString });

问题在于:

public Point Control.PointToScreen(Point p)

此方法将 Point 作为参数并返回 Point 。我如何通过Control.Invoke调用它?

3 个答案:

答案 0 :(得分:0)

myWhatever.Invoke(myDelegate, new object[] { myParam1, myParam2, myParam3 });

答案 1 :(得分:0)

看看this,您可以调整函数UpdateStatusBarMessage_OnNewStatusMessage,以显示表单而不是编写消息。

答案 2 :(得分:0)

WRT“一种更好的方式来显示一个以主线形式为中心的形状而不管线程,这将是很好的” - 你确实不需要手动对中。 :)

  1. 在显示之前(可能是调用ShowDialog),将子对话框中的StartPosition属性设置为CenterParent
  2. 如果活动窗口(具有创建对话框的按钮)不是预期的父级(根据您的方案听起来不太可能),您可以调用ShowDialog overload that lets you specify the parent。我认为你不需要这个,但这可以让你在某种程度上任意地对话。 :)