0

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

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

4

1 回答 1

0

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

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

于 2009-05-02T04:07:04.457 回答