現在、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()メソッドに関する優れたドキュメントを見つけることができませんでしたが、正しく使用しているようです。私が間違っていることについて何か考えはありますか?
2009年4月28日編集:まだ答えが見つかりませんが、Transform()メソッドを適切に使用しています。この問題は、Page.Loadedイベント中にInitControl()メソッドを呼び出した場合にのみ発生します。数秒待ってから(たとえば)Button_Clickイベントから呼び出すと、同じコードが正常に機能します。SLのドキュメントによると、Page.Loadedイベントが発生するまでにすべてが適切にレイアウトされている必要がありますが、そうではないことは明らかです。
また、Page.Loadedイベントから呼び出された場合でも、上記のコードは完全に正常に機能する場合があることにも注意してください。は。
これまでの私の回避策は、フォームがロードされてから数秒間コントロールを非表示にしてから表示することです。それは醜いハックですが、誰かがより良いアイデアを持っていない限り...?