我正在开发“托管”Flash 实例的 Silverlight 自定义控件。当然,您执行此操作的方法是将相关的 HTML 元素放置在您的 Silverlight 实例上,如此处所述。我遇到的问题是,当我使用 GeneralTransform.Transform() 方法获取控件的绝对坐标,以便我可以正确定位 HTML 元素时,返回的 Point 对象始终具有 .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() 方法时,才会出现问题。如果我等待几秒钟,然后从 Button_Click 事件中调用它(比如说),相同的代码可以正常工作。根据 SL 文档,在 Page.Loaded 事件触发时,所有内容都应适当布置,但显然情况并非如此。
我还应该注意,每隔一段时间,上面的代码都可以正常工作,即使它是从 Page.Loaded 事件中调用的。嗯。
到目前为止,我的解决方法是在表单加载后隐藏控件几秒钟,然后显示它。这是一个丑陋的黑客,但除非有人有更好的想法......?