我正在开发一个“托管”Flash实例的Silverlight自定义控件。当然,这样做的方法是将有问题的HTML元素放在Silverlight实例上,如here所述。我遇到的问题是,当我使用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事件中调用的。咦。
到目前为止,我的解决方法是,在表单加载后隐藏控件几秒钟,然后显示它。这是一个丑陋的黑客,但除非有人有更好的想法......?
答案 0 :(得分:0)
这是由于RootVisual的轴为0 x x / y。尝试使用树中的下一个元素,默认情况下它通常是layoutRoot(假设您没有更改其名称等)。那或利用FindName()来确保您直接引用您希望将iFrame定位的所述图层。
Scott Barnes / Rich Platforms产品经理/ Microsoft。