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

说明: 项目利用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" />



 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值