Я работаю над созданием очень простого элемента управления 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.
Вот еще несколько примеров того, что я пытаюсь сделать: