C# 如何将引用类型传递给控件。调用/显示以主窗体为中心的窗体

C# 如何将引用类型传递给控件。调用/显示以主窗体为中心的窗体,c#,winforms,asynchronous,C#,Winforms,Asynchronous,我在UI线程以外的线程上,需要显示一个以应用程序主窗体为中心的模式窗体。我通常使用主窗体和模态窗体的宽度和高度来计算位置,然后使用主窗体的PointToScreen方法来获得模态窗体的位置。因为我在另一个线程上,所以我需要使用Control.Invoke来调用这个方法。我就是不知道如何将Point类型的参数传递给Control.Invoke params object[]。值类型和字符串工作正常 或者,如果有人能找到一种更好的方式来显示以主窗体为中心的窗体,而不考虑线程,那就太好了。Messag

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

或者,如果有人能找到一种更好的方式来显示以主窗体为中心的窗体,而不考虑线程,那就太好了。MessageBox似乎能够做到这一点,尽管不是通过模式实现的

编辑 我打这样的电话没问题

mainform.Invoke(..., object[] { someString });
问题是:

public Point Control.PointToScreen(Point p)

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

mywhather.InvokemyDelegate,新对象[]{myParam1,myParam2,myParam3}

查看一下,您可以调整函数UpdateStatusBarMessage\u OnNewStatusMessage来显示表单,而不是编写消息。

WRT有一种更好的方法来显示以主表单为中心的表单,而不考虑线程,这将非常好-您确实不需要手动执行此居中操作:

在显示调用ShowDialog之前,假定将子对话框上的属性设置为。 如果活动窗口中有创建对话框的按钮,则根据您的场景,该对话框不是预期的父窗口,您可以调用。我认为您不需要这个,但这可以让您在某种程度上随意设置对话框的父对象:
myParam1的类型是什么?试试这个。myWhatever.InvokemyDelegate,新对象[]{new Point5,5};如果你能让它工作,请告诉我如何。FWIW,你不必自己创建对象数组,你可以调用edel,p1,p2,p3,让编译器为你做。太棒了!你能做到吗?公共委托点指向筛选委托点。。。私有静态点ThreadSafePointToScreenPoint点{if mainwin!=null&&mainwin.InvokeRequired mainwin.Invokenew PointToScreen删除ThreadSafePointToScreen,新对象[]{new Point5,5};否则…}哦,那将返回mainwin.Invoke。。。。点是双关语,PointToScreen需要一个点作为参数并返回一个点。这应该不是问题,我用同样的方式传递我自己的类对象。在新对象[]{new Point5,5}部分;您应该能够创建新对象[]{ptObj};传递函数以将所需的值返回到窗体。不要忘记,您需要引用mainwin作为父对象。无法传递详细信息并在主线程中创建表单吗?父级似乎为空,因此CenterParent无法工作。我的表单的Location属性最终为0,0。但我完全忘记了在ShowDialog中指定父对象的功能。谢谢,James.FWIW,你说“值类型和字符串很好”,但重点是一个值类型:如果你坚持使用这种居中方法,我很可能会建议在主窗体上创建一个新方法,创建子窗体,使用主窗体和子窗体进行居中逻辑,然后在UI线程上调用这个新方法。这样做可以将所有内容都包含在一个方法中,并且不必担心在线程之间传递点。