Использование TransformToVisual в Silverlight для позиционирования элементов HTML - PullRequest
0 голосов
/ 24 апреля 2009

Я нахожусь в процессе разработки пользовательского элемента управления 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. Да.

Мой обходной путь, пока он стоит, - скрыть элемент управления на пару секунд после загрузки формы, а затем показать его. Это безобразный хак, но разве у кого-нибудь есть идеи получше ...?

1 Ответ

0 голосов
/ 02 мая 2009

Это связано с тем, что RootVisual имеет ось 0,0 x / y. Попробуйте использовать следующий элемент в дереве, обычно это по умолчанию layoutRoot (при условии, что вы не изменили его имя и т. Д.). Это или используйте FindName (), чтобы убедиться, что у вас есть прямая ссылка на указанный слой, на который вы хотите поместить iFrame.

Скотт Барнс / Менеджер по продуктам Rich Platforms / Microsoft.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...