Silverlight4里面嵌入html页面或者asp.net(jsp)控件实现

来源:互联网 发布:ps手绘软件 编辑:程序博客网 时间:2024/05/23 17:07

说明: 项目利用HtmlPage和WebBrowser实现了oob和非oob模式下现实html页面的现实。不用使用windowless=true模式。

问题:浏览器有滚动条的话,你拖动它,html页面也会动,还有就是你点击silverlight页面,html页面就会影藏,其实也是跑到silverlight页面后面。不知道如何解决。

控件实现

<ResourceDictionary    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     xmlns:local="clr-namespace:SlAndHtml">        <Style TargetType="local:HtmlControl" >        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="local:HtmlControl">                    <Grid x:Name="Root" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}">                        <WebBrowser x:Name="WebBrowserOOB" Source="{TemplateBinding NavigationUrl}"></WebBrowser>                    </Grid>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style></ResourceDictionary>


 

/* *       软件:   sl和html混合显示测试项目 *       说明:   实现了oob下和非oob下html页面的显示功能 *       问题:   当控件被点击后在选择sl控件,控件显示的html就看不见了非oob模式下 *     创建者:   Jake Tina *   创建日期:   2011年11月30日 *   创建版本:   Ver 0.01 *     修改人:           (每次修改请在这里追加,并修改最终版本号。) *   修改日期:    *   修改内容:    *   修改版本:    * */using System;using System.ComponentModel;using System.Threading;using System.Windows;using System.Windows.Browser;using System.Windows.Controls;using System.Windows.Media;namespace SlAndHtml{    public partial class HtmlControl : ContentControl    {        private int _htmlControlLeft = 0;        private int _htmlControlTop = 0;        private double _width = 0;        private double _height = 0;        private readonly int _htmlZIndex = 1;        private Scrol _scrolling;        private readonly string _htmlControlId = System.Guid.NewGuid().ToString();        public static readonly DependencyProperty NavigationUrlProperty = DependencyProperty.Register("NavigationUrl", typeof(Uri), typeof(HtmlControl), null);        private Thread _thread = null;        /// <summary>        /// OOB下面使用        /// </summary>        private WebBrowser webBrowser = null;        private HtmlElement divIFrameHost;        /// <summary>        /// 获取当前控件的编号        /// </summary>        public String HtmlControlId        {            get { return _htmlControlId; }        }        /// <summary>        /// 获取或设置网页地址        /// </summary>        public Uri NavigationUrl        {            get { return new Uri(Convert.ToString(GetValue(NavigationUrlProperty))); }            set { SetValue(NavigationUrlProperty, value); }        }        /// <summary>        /// 设置是否有滚动条        /// </summary>        public Scrol HtmlScrolling        {            get { return _scrolling; }            set { _scrolling = value; }        }        public HtmlControl()        {                        if (Application.Current.IsRunningOutOfBrowser)            {                DefaultStyleKey = typeof(HtmlControl);            }            else            {                Loaded += new RoutedEventHandler(HtmlControl_Loaded);            }        }        public override void OnApplyTemplate()        {            base.OnApplyTemplate();        }        void HtmlControl_Loaded(object sender, RoutedEventArgs e)        {            //MessageBox.Show(this.Parent.ToString());            //如果是设计模式忽略下面的代码            if (DesignerProperties.GetIsInDesignMode(this))            {                return;            }            if (!Application.Current.IsRunningOutOfBrowser)            {                HtmlElement element = HtmlPage.Document.GetElementById("_silverlightControlHost");                element.SetAttribute("windowless", "true");                UpdateSize();                Loaded -= new RoutedEventHandler(HtmlControl_Loaded);            }        }        public void InitializeComponent()        {            HtmlDocument doc = HtmlPage.Document;            divIFrameHost = doc.CreateElement("div");            divIFrameHost.SetStyleAttribute("position", "absolute");            divIFrameHost.SetAttribute("id", System.Guid.NewGuid().ToString());            divIFrameHost.SetStyleAttribute("height", string.Format("{0}px", _height - 5));            divIFrameHost.SetStyleAttribute("width", string.Format("{0}px", _width - 5));            divIFrameHost.SetStyleAttribute("left", string.Format("{0}px", _htmlControlLeft));            divIFrameHost.SetStyleAttribute("top", string.Format("{0}px", _htmlControlTop));            divIFrameHost.SetStyleAttribute("z-index", _htmlZIndex.ToString());            divIFrameHost.AppendChild(CreateIFrameControl(doc));            doc.Body.AppendChild(divIFrameHost);        }        private HtmlElement CreateIFrameControl(HtmlDocument doc)        {            HtmlElement iFrame = doc.CreateElement("IFRAME");            iFrame.SetAttribute("src", NavigationUrl.AbsolutePath);            iFrame.SetStyleAttribute("height", "100%");            iFrame.SetStyleAttribute("width", "100%");            iFrame.SetStyleAttribute("left", "0px");            //iFrame.SetStyleAttribute("position", "fixed");            iFrame.SetAttribute("frameborder", "0");            iFrame.SetAttribute("display", "inline");            iFrame.SetAttribute("allowTransparency", "true");            iFrame.SetStyleAttribute("top", "0px");            iFrame.SetAttribute("scrolling", _scrolling.ToString());            iFrame.Id = System.Guid.NewGuid().ToString();            return iFrame;        }        private void UpdateSize()        {            _thread = new Thread(new ThreadStart(SizeUpate));            _thread.Start();        }        private void SizeUpate()        {            this.Dispatcher.BeginInvoke(() =>            {                while (true)                {                    GeneralTransform gt = this.TransformToVisual(Application.Current.RootVisual as UIElement);                    Point offset = gt.Transform(new Point(0, 0));                    double x = offset.X;                    double y = offset.Y;                    this._width = this.ActualWidth;                    this._height = this.ActualHeight;                    if (x <= 0 && y <= 0)                    {                        continue;                    }                    else                    {                        _htmlControlLeft = (int)x;                        _htmlControlTop = (int)y;                        InitializeComponent();                        _thread = null;                        break;                    }                }            });        }    }    public enum Scrol    {        No,        Yes    }}

控件使用

 <my:HtmlControl Grid.Row="2" x:Name="htmlcon"  NavigationUrl="http://www.baidu.com" />



 

原创粉丝点击