Я работаю над созданием очень простого элемента управления 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.
Вот еще несколько примеров того, что я пытаюсь сделать:
- http://www.wintellect.com/cs/blogs/jlikness/archive/2010/09/19/hosting-html-in-silverlight-not-out-of-browser.aspx
- http://www.davidezordan.net/blog/?p=700
- http://csharp-snippets.blogspot.com/2009/03/html-host-control-in-silverlight.html
- http://www.codeproject.com/KB/silverlight/BlendPDFwithSilverlight.aspx