在Silverlight中使用TransformToVisual来定位HTML元素

时间:2009-04-24 14:19:19

标签: silverlight transform

我正在开发一个“托管”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事件中调用的。咦。

到目前为止,我的解决方法是,在表单加载后隐藏控件几秒钟,然后显示它。这是一个丑陋的黑客,但除非有人有更好的想法......?

1 个答案:

答案 0 :(得分:0)

这是由于RootVisual的轴为0 x x / y。尝试使用树中的下一个元素,默认情况下它通常是layoutRoot(假设您没有更改其名称等)。那或利用FindName()来确保您直接引用您希望将iFrame定位的所述图层。

Scott Barnes / Rich Platforms产品经理/ Microsoft。