代码之家  ›  专栏  ›  技术社区  ›  Ken Smith

在Silverlight中使用TransformToVisual定位HTML元素

  •  0
  • Ken Smith  · 技术社区  · 15 年前

    我正在开发一个“托管”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事件调用,上面的代码偶尔也能很好地工作。呵呵。

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   Scott    15 年前

    这是因为rootvisual具有0.0 x/y轴。尝试使用树中的下一个元素,通常是默认的layoutRoot(假设您没有更改它的名称等)。或者使用findname()确保直接引用要定位iframe的层。

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