Положение управления Silverlight IFrame относительно окна браузера - PullRequest
0 голосов
/ 23 августа 2011

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

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

IFrame SilverlightЭлемент управления используется внутри приложения 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 для упаковки id, а затем использовал 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, а не всегда изокно браузера.Я добавил код для цикла, пока смещение не будет нулевым.Код сейчас в основном работает.

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

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

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

...