我正在为silverlight制作一个非常简单的IFrame控件。
目标:控制覆盖在silverlight应用程序上的IFrame的位置
Silverlight IFrame控件正在Silverlight应用程序中使用,允许用户构建搜索查询,然后从搜索查询形成URL并将其设置为IFrame的源。这是一个基本的搜索应用程序。
我希望IFrame根据silverlight控件的大小和位置改变大小和位置。
我在这里找到了代码:http://www.kirupa.com/blend_silverlight/absolute_position_transformtovisual.htm,我在silverlight控件的构造函数中放置了相对于silverlight应用程序的控件位置。然后我使用该位置设置silverlight控件的IFrameLeft和IFrameTop依赖属性。
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。然后使用该Guid作为id创建一个IFrame。
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应用程序占用整个浏览器窗口时,它才能正常工作。然而,这并不是我最常使用的方式。
通过阅读这个问题:Getting absolute position of an element relative to browser,如果我能够获得对Silverlight应用程序所托管的对象标签HtmlElement的引用,我可以阅读offsetleft和offsettop属性。如果我有对象标签相对于浏览器的位置,我似乎很容易计算出Silverlight控件与浏览器的偏移量。因为我可以确定silverlight控件与silverlight应用程序的偏移。
过去我刚刚给对象或包装div标签id,然后使用HtmlPage.Document.GetElementById来获取对元素的引用。如果可能的话,我想避免这种情况。
我在获取GeneralTransform并设置IFrame Left和Top之后在LayoutUpdated事件中尝试了这个。它获取object标签并使用我之前谈到的偏移属性。
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);
}
使用object标签来获取浏览器窗口的偏移量,我在测试它的其中一个页面遇到了一些问题然后我了解到偏移量来自offsetparent,而不是总是来自浏览器窗口。我添加了代码循环,直到offsetparent为null。代码现在基本可行。
我希望能够将silverlight控件放在任何位置,并且IFrame包含在控件的区域中,并且位于控件的位置。
我对任何有关定位IFrame以匹配silverlight控件的更好方法的想法持开放态度。
以下是我正在尝试做的一些例子: