WP7 浏览器控件WebBrowser历史记录、前进、后退、刷新功能实现

由于要在应用程序内部访问网页,不跳出应用。所以要实现一个浏览器。但是悲催的事windows phone8
的WebBrowser控件已经支持了像CanGoBack
,CanGoForward,GoBack,GoForwar
d等这些功能,但是wp7没有就实现了几个前进后退几个功能。用在page里面也很简单,实现的效果如下图所示。

因为使用十分简单。和windows phone8上的WebBrowser一样的。我就直接给控件的代码,就帖使用的代码了。

代码如下,注释也都写的比较清楚。

using System;

using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Windows.Markup;
using System.Text.RegularExpressions;
using Microsoft.Phone.Tasks;
using System.Collections.Generic;
using System.Windows.Navigation;

namespace Controls.HcControl
{
public class HcWebView : Control
{
/// <summary>
/// Gets the ControlTemplate string for the control.
/// </summary>
/// <remarks>
/// Not in generic.xaml so the implementation of HcWebView can be entirely in this file.
/// </remarks>
private static string TemplateString
{
get
{
return
"<ControlTemplate " +
"xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" " +
"xmlns:phone=\"clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone\" " +
"xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" +
"<Grid>" +
"<phone:WebBrowser x:Name=\"WebBrowser\" IsScriptEnabled=\"True\"/>" +
"</Grid>" +
"</ControlTemplate>";
}
}

//----------对象的内部成员
#region Member

/// <summary>
/// WebBrowser.
/// </summary>
private WebBrowser _webBrowser;

/// <summary>
/// 历史Uri记录堆栈
/// </summary>
private List<Uri> _historyStack;

/// <summary>
/// 历史记录堆栈索引
/// </summary>
private int _historyStackIndex;

/// <summary>
/// 导航到的Uri是否来自历史堆栈
/// </summary>
private bool _fromHistory;

private bool canGoBack;
/// <summary>
/// 获取一个值,该值指示 WebBrowser 是否可以在浏览历史记录中向前导航一个页面。
/// </summary>
public bool CanGoBack
{
get
{
return (_historyStackIndex > 1);
}
internal set
{
canGoBack = value;
}
}

private bool canGoForward;
/// <summary>
/// 获取一个值,该值指示 WebBrowser 是否可以在浏览历史记录中向前导航一个页面。
/// </summary>
public bool CanGoForward
{
get
{
return (_historyStackIndex < _historyStack.Count);
}
internal set
{
canGoForward = value;
}
}

#endregion

//----------对象的生命周期
#region LifeCycle

/// <summary>
/// Initializes a new instance of the HcWebView class.
/// </summary>
public HcWebView()
{
this._historyStack = new List<Uri>();
this._historyStackIndex = 0;
this._fromHistory = false;

this.Template = (ControlTemplate)XamlReader.Load(TemplateString);
}

/// <summary>
/// Invoked when a new Template is applied.
/// </summary>
public override void OnApplyTemplate()
{
base.OnApplyTemplate();

if (_webBrowser != null)
{
_webBrowser.LoadCompleted -= OnLoadCompleted;
_webBrowser.Navigated -= OnNavigated;
_webBrowser.Navigating -= OnNavigating;
_webBrowser.NavigationFailed -= OnNavigationFailed;
_webBrowser.ScriptNotify -= OnScriptNotify;
}

_webBrowser = GetTemplateChild("WebBrowser") as WebBrowser;

if (_webBrowser != null)
{
_webBrowser.LoadCompleted += OnLoadCompleted;
_webBrowser.Navigated += OnNavigated;
_webBrowser.Navigating += OnNavigating;
_webBrowser.NavigationFailed += OnNavigationFailed;
_webBrowser.ScriptNotify += OnScriptNotify;
}
}

#endregion

//----------对象响应的事件
#region Events

/// <summary>
/// 在 WebBrowser 控件已加载内容之后引发的事件。
/// </summary>
public event LoadCompletedEventHandler LoadCompleted;
private void OnLoadCompleted(object sender, NavigationEventArgs e)
{
if (LoadCompleted != null)
{
LoadCompleted(this, e);
}
}

/// <summary>
/// 在 WebBrowser 控件成功导航之后引发的事件。
/// <summary>
public event EventHandler<NavigationEventArgs> Navigated;
private void OnNavigated(object sender, NavigationEventArgs e)
{
if (!_fromHistory)
{
if (_historyStackIndex < _historyStack.Count)
{
_historyStack.RemoveRange(_historyStackIndex, _historyStack.Count - _historyStackIndex);
}
_historyStack.Add(e.Uri);
_historyStackIndex += 1;
}
_fromHistory = false;
if (Navigated != null)
{
Navigated(this, e);
}
}

/// <summary>
/// 当浏览器控件正在导航(包括从重定向)时引发的事件。
/// </summary>
public event EventHandler<NavigatingEventArgs> Navigating;
private void OnNavigating(object sender, NavigatingEventArgs e)
{
if (Navigating != null)
{
Navigating(this, e);
}
}

/// <summary>
/// 在 WebBrowser 控件导航失败之后引发的事件。
/// </summary>
public event NavigationFailedEventHandler NavigationFailed;
private void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (NavigationFailed != null)
{
NavigationFailed(this, e);
}
}

/// <summary>
/// 当 Javascript 调用 window.external.notify(<data>) 时引发的事件
/// </summary>
public event EventHandler<NotifyEventArgs> ScriptNotify;
private void OnScriptNotify(object sender, NotifyEventArgs e)
{
if (ScriptNotify != null)
{
ScriptNotify(this, e);
}
}

#endregion

//----------对象的内部函数
#region Methods

/// <summary>
/// WebBrowser 在浏览历史记录中向后导航一个页面。
/// </summary>
public void GoBack()
{
if (_historyStackIndex > 1)
{
_historyStackIndex -= 1;
_fromHistory = true;
_webBrowser.Navigate(_historyStack[_historyStackIndex - 1]);
}
}

/// <summary>
/// WebBrowser 在浏览历史记录中向前导航一个页面。
/// </summary>
public void GoForward()
{
if (_historyStackIndex < _historyStack.Count)
{
_historyStackIndex += 1;
_fromHistory = true;
_webBrowser.Navigate(_historyStack[_historyStackIndex - 1]);
}
}

/// <summary>
/// Refresh HcWebView
/// </summary>
public void RefreshWebView()
{
if ((this._webBrowser) != null && (this._webBrowser.Source != null))
{
this._webBrowser.Source = new Uri(this._webBrowser.Source.ToString());
}
}

/// <summary>
/// 应用程序启动“Web 浏览器”应用程序。
/// </summary>
public void ShowWebBrowser()
{
WebBrowserTask webTask = new WebBrowserTask();
if ( (this._webBrowser) != null && (this._webBrowser.Source != null))
{
webTask.Uri = this._webBrowser.Source;
}
webTask.Show();
}

#endregion

//----------对象的依赖属性
#region DependencyProperty

#region Source DependencyProperty

/// <summary>
/// Gets or sets the Source.
/// </summary>
public Uri Source
{
get { return (Uri)GetValue(SourceProperty); }
set { SetValue(SourceProperty, value); }
}

/// <summary>
/// Identifies the Source dependency property.
/// </summary>
public static readonly DependencyProperty SourceProperty =
DependencyProperty.Register("Title", typeof(Uri), typeof(HcWebView), new PropertyMetadata(null, new PropertyChangedCallback(OnSourceChanged)));

/// <summary>
/// Prevents the webWiew Source from transitioning into a Semiexpanded or Collapsed visual state if the Source is not set.
/// </summary>
/// <param name="obj">The dependency object.</param>
/// <param name="e">The event information.</param>
private static void OnSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
HcWebView webView = (HcWebView)obj;

if (e.NewValue != null)
{
webView._webBrowser.Source = e.NewValue as Uri;
}
}

#endregion

#endregion
}
}

原文转自:http://www.cr173.com/html/19834_1.html

WP7 浏览器控件WebBrowser历史记录、前进、后退、刷新功能实现,布布扣,bubuko.com

时间: 2024-10-05 15:45:54

WP7 浏览器控件WebBrowser历史记录、前进、后退、刷新功能实现的相关文章

WebBrowser是IE内置的浏览器控件 ,转载

WebBrowser是IE内置的浏览器控件,无需用户下载. 一.WebBrowser控件 <object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object> 二.WebBrowder控件的方法 //打印 WebBrowser1.ExecWB(6,1); //打印设置 WebBrowser1.ExecWB(8,1); //打印预览 WebBrow

基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址

转载请说明原出处,谢谢~~ 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度,我只是按照原来作者的demo,把相应的消息封装成duilib对应的. 在此首先要感谢wke内核的作者BlzFans以及soui2界面库的作者flyhigh,BlzFans精简了webkit内核后封装为wke并公布了源码,flyhigh对wke进行处理让他更容易移植到dui工程中.wke内核10M大

JxBrowser Java浏览器控件详细介绍

JxBrowser能在Windows.Linux.Mac OS X (Intel and PPC-based)平台上将Mozilla Firefox浏览器完美地整合到Java AWT/Swing应用程序里.该库程序使用Gecko设计引擎来转换HTML文档.因而保证了它能与许多Internet标准(如HTML 4.CSS.XML.JavaScript以及其它)兼容. 主要功能 用来将HTML浏览程序内置到AWT/Swing用户界面上的可视浏览器控件 使用Gecko 1.9/Firefox 3代码库

JxBrowser Java浏览器控件详细介绍及下载

JxBrowser能在Windows.Linux.Mac OS X (Intel and PPC-based)平台上将Mozilla Firefox浏览器完美地整合到Java AWT/Swing应用程序里.该库程序使用Gecko设计引擎来转换HTML文档.因而保证了它能与许多Internet标准(如HTML 4.CSS.XML.JavaScript以及其它)兼容. 主要功能 用来将HTML浏览程序内置到AWT/Swing用户界面上的可视浏览器控件 使用Gecko 1.9/Firefox 3代码库

JAVA SWING嵌入IE浏览器控件JExplorer详细介绍及下载

JExplorer用于在Swing程序中添加Microsoft Internet Explorer的控件.您可以结合JNIWrapper中的共同特点来使用该类库,尤其是当您需要使用低级Internet Explorer的API函数来深度整合MSHTML和DOM功能时. 具体功能: JExplorer具有多种功能特点,方便您在Java程序中整合Internet Explorer Visual Browser组件用于嵌入一个Swing用户界面中,并自动执行HeadlessBrowser进行测试 自动

UIWebView --- 内置的浏览器控件 加载网页

描述:UIWebVIew 是IOS一个常见的控件,属内置的浏览器控件,可以用来加载网页,或是打开文件等等. 方法一: 代码实现:(运行程序时,直接显示链接的内容) #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSURL * url=[NSURL URLWithSt

UIWebView浏览器控件常用属性与方法汇总

一.什么是UIWebView UIWebView是iOS内置的浏览器控件 系统自带的Safari浏览器就是通过UIWebView实现的 二.UIWebView常用属性和方法 UIWebView常用的加载资源的方法 - (void)loadRequest:(NSURLRequest *)request; @property(nonatomic) UIDataDetectorTypes dataDetectorTypes; // 需要进行检测的数据类型 @property(nonatomic,rea

Essential HTMLUI 浏览器控件介绍及下载

Essential HTMLUIfor Windows Forms是一款WinForm控件用于呈现HTML,功能很像一个Web浏览器,支持各种各样的HTML标签,可以显示丰富的HTML文档,支持导出和打印. 具体功能: HTMLUI是一款完全与浏览器独立的控件,支持以URL的形式打开HTML 支持从用户驱动器路里加载任何HTML页面 支持使用图片代替文本用于连接到其他文件 支持以流的形式加载HTML文档 支持各种各样的HTML标签,格式化相关的标签 支持外部的.内在的.内嵌的样式,支持在运行时添

C++_MFC 如何确定当页面是在 web 浏览器控件的加载

若要在 Visual C++ DocumentComplete 处理并确定完成该 Web 页的下载后,请按照下列步骤. 请注意,您所执行的步骤取决于您使用 web 浏览器控件的方式. 如果要在 CWnd/CView 对象创建 web 浏览器控件,则必须按照步骤 1 到 4. 如果您正在 CDialog/CFormView 对象中创建 web 浏览器控件,只需执行第 4 步. 如果您使用的 Visual C++ 6.0 所附带的 CHtmlView 类,重写 CHtmlView::Document