我正在开发一个“托管”Flash实例的Silverlight自定义控件。当然,您这样做的方式是将有问题的HTML元素放在您的Silverlight实例上,如前所述,比如,
here
. 我遇到的问题是,当我使用GeneralTransform.Transform()方法获取控件的绝对坐标时,为了能够正确定位HTML元素,返回的点对象总是.x=0和.y=0。
public void InitControl(string id)
{
GeneralTransform gt = this.TransformToVisual(Application.Current.RootVisual);
Point localPos = gt.Transform(new Point(_htmlControlLeft, _htmlControlTop));
// Create the containing DIV tag.
HtmlDocument doc = HtmlPage.Document;
divHost = doc.CreateElement("div");
divHost.SetAttribute("id", System.Guid.NewGuid().ToString());
divHost.SetStyleAttribute("position", "absolute");
divHost.SetStyleAttribute("left", localPos.X.ToString() + "px"); // always 0
divHost.SetStyleAttribute("top", localPos.Y.ToString() + "px"); // always 0
Debug.WriteLine("x,y=" + localPos.X.ToString() + "," + localPos.Y.ToString());
divHost.SetStyleAttribute("width", Width.ToString() + "px");
divHost.SetStyleAttribute("height", Height.ToString() + "px");
divHost.SetStyleAttribute("z-index", _htmlZIndex.ToString());
}
我还没有找到关于generalTransform.transform()方法的优秀文档,但是它
似乎
好像我用得对。有没有想过我做错了什么?
编辑4/28/09:我仍然没有找到答案,但是我正确地使用了transform()方法。只有在page.loaded事件期间调用initcontrol()方法时才会出现此问题。如果我等几秒钟,然后从按钮单击事件调用它(比如),同样的代码也可以正常工作。根据sl文档,在页面被加载事件触发时,所有内容都应该被适当地安排好,但显然情况并非如此。
我还应该注意到,即使是从page.loaded事件调用,上面的代码偶尔也能很好地工作。呵呵。
到目前为止,我的解决方法是在窗体加载后将控件隐藏几秒钟,然后显示它。这是一个丑陋的黑客,但除非有人有更好的想法…?