Я нахожусь в процессе разработки пользовательского элемента управления Silverlight, который "размещает" экземпляр Flash. Конечно, вы можете расположить соответствующий 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 (), но кажется , как будто я правильно его использую. Есть мысли о том, что я делаю не так?
Редактировать 28.04.09: Я до сих пор не нашел ответа, но я правильно использую метод Transform (). Проблема появляется, только если я вызываю метод InitControl () во время события Page.Loaded. Если я подожду несколько секунд, а затем вызову его (скажем) из события Button_Click, тот же код работает нормально. Согласно документам SL, все должно быть выложено надлежащим образом к моменту возникновения события Page.Loaded, но, очевидно, это не так.
Я также должен отметить, что время от времени приведенный выше код прекрасно работает, даже если он вызывается из события Page.Loaded. Да.
Мой обходной путь, пока он стоит, - скрыть элемент управления на пару секунд после загрузки формы, а затем показать его. Это безобразный хак, но разве у кого-нибудь есть идеи получше ...?