Положение элемента управления Silverlight IFrame относительно окна браузера

Я работаю над созданием очень простого элемента управления IFrame для Silverlight.

Цель: управление размещением IFrame, накладываемого на приложение Silverlight

Элемент управления Silverlight IFrame используется внутри приложения Silverlight, которое позволяет пользователю создавать поисковый запрос, затем из поискового запроса формируется URL-адрес, который устанавливается в качестве источника IFrame. Это базовое приложение для поиска.

Я хочу, чтобы IFrame менял размер и положение в зависимости от размера и положения элемента управления Silverlight.

Я нашел код здесь: http://www.kirupa.com/blend_silverlight/absolute_position_transformtovisual.htm, который я поместил в конструктор элемента управления Silverlight, чтобы получить положение элемента управления относительно приложения Silverlight. Затем я использую это положение для установки свойств зависимостей IFrameLeft и IFrameTop элемента управления Silverlight.

        this.LayoutUpdated += (obj, args) =>
            {
                GeneralTransform gt = HtmlViewerStackPanel.TransformToVisual(null);
                Point point = gt.Transform(new Point());

                IFrameLeft = (int)point.X;
                IFrameTop = (int)point.Y;

            };

Затем в событии SizeChanged у меня есть следующее, которое вносит изменения в IFrame. В конструкторе я установил FrameID как новый Guid. Затем создайте IFrame с этим Guid в качестве идентификатора.

    private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
    {

        IFrameHeight = (int)this.ActualHeight;
        IFrameWidth = (int)this.ActualWidth;

        var iframeElement = System.Windows.Browser.HtmlPage.Document.GetElementById(this.IFrameID);
        iframeElement.SetStyleAttribute("width", string.Format("{0}px", IFrameWidth));
        iframeElement.SetStyleAttribute("height", string.Format("{0}px", IFrameHeight));

    }

Это работает только в том случае, если приложение Silverlight занимает все окно браузера. Однако это не то, как я чаще всего использую его.

Из чтения этого вопроса: Получение абсолютной позиции элемента относительно браузера, похоже, что если бы я мог получить ссылку на тег объекта HtmlElement, в котором размещено приложение Silverlight, я мог бы прочитать свойства offsetleft и offsettop. Если бы у меня была позиция тега объекта относительно браузера, кажется, что я мог бы очень легко вычислить смещение элемента управления Silverlight от браузера. Так как я могу определить смещение элемента управления silverlight от приложения silverlight.

В прошлом я просто давал объекту или обертывающему тегу div идентификатор, а затем использовал HtmlPage.Document.GetElementById, чтобы получить ссылку на элемент. Я хотел бы избежать этого, если это возможно.

Я попробовал это в событии LayoutUpdated после получения GeneralTransform и установки IFrame Left и Top. Он получает тег объекта и использует свойства смещения, о которых я говорил ранее.

                var objectElements = System.Windows.Browser.HtmlPage.Document.GetElementsByTagName("object");

                if (objectElements.Count == 1)
                {
                    var objElement = objectElements.Single();

                    do
                    {
                        IFrameLeft += Convert.ToInt32(objElement.GetProperty("offsetLeft"));
                        IFrameTop += Convert.ToInt32(objElement.GetProperty("offsetTop"));

                    } while ((objElement=(System.Windows.Browser.ScriptObject)objElement.GetProperty("offsetParent")) != null);
                }

Использование тега объекта для получения смещения из окна браузера работает, у меня были некоторые проблемы с одной из страниц, на которых я тестировал его, затем я узнал, что смещения исходят от offsetparent, а не всегда из окна браузера. Я добавил код в цикл, пока offsetparent не станет нулевым. Код теперь в основном работает.

Я хочу иметь возможность размещать элемент управления Silverlight в любом месте, а IFrame должен находиться в области элемента управления и находиться в положении элемента управления.

Я открыт для любых идей о лучшем подходе к позиционированию IFrame, чтобы он соответствовал элементу управления Silverlight.

Вот еще несколько примеров того, что я пытаюсь сделать:


person 249076    schedule 23.08.2011    source источник
comment
Я не уверен, что вопрос здесь? Вы упомянули, что «код теперь в основном работает, так что...   -  person JasonRShaver    schedule 24.08.2011
comment
Я хотел бы иметь возможность получить код, гарантирующий, что IFrame ограничен размерами и положением пользовательского элемента управления SilverLight.   -  person 249076    schedule 30.08.2011