我正在为我的控件开发UI自动化。以下代码在VS2012中正常工作。
MyControl.PointToClient(p);
我也使用下面的代码来调用控件
public new Point PointToClient(Point p)
{
if (MyControl.InvokeRequired)
{
pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient);
GetWindow().Invoke(ptcb, new object[] { p });
}
return MyControl.PointToClient(p);
}
delegate Point pointToClientCallBack(Point p);
在我调用我的控件后,InvokeRequired属性为true。
那么,请你建议我解决这个问题的正确方法。
谢谢,
答案 0 :(得分:1)
VS2012和VS2013之间有什么不同?
我不确定,但我确实知道你return
之后没有Invoke
所以之后它会从工作线程调用return MyControl.PointToClient(p);
。
变化:
public new Point PointToClient(Point p)
{
if (MyControl.InvokeRequired)
{
pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient);
GetWindow().Invoke(ptcb, new object[] { p });
}
return MyControl.PointToClient(p);
}
...为:
public new Point PointToClient(Point p)
{
if (MyControl.InvokeRequired)
{
pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient);
return GetWindow().Invoke(ptcb, new object[] { p }) as Point;
}
return MyControl.PointToClient(p);
}
请注意,我们需要将从Invoke
返回的对象转换为Point
以匹配您的方法签名。
此外,您可能应该使用BeginInvoke
而不是Invoke
,因为后者会导致死锁。