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