📄 pagedwebbrowser.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace APLib.Windows.Control
{
/// <summary>
/// 多页面浏览器控件
/// 继承自TabControl,配合WebPage使用
/// </summary>
public partial class PagedWebBrowser : TabControl
{
/// <summary>
/// 拦截弹出窗口级别枚举
/// </summary>
public enum PopupBlockLevel : int
{
None = 0,
Low = 1,
Medium = 2,
High = 3
}
#region ScriptErrorEventArgs
/*
/// <summary>
/// 脚本错误事件参数类
/// </summary>
public class ScriptErrorEventArgs : EventArgs
{
/// <summary>
/// 出错的页面地址
/// </summary>
private string url;
/// <summary>
/// 错误描述
/// </summary>
private string description;
/// <summary>
/// 错误行号码
/// </summary>
private int lineNumber;
/// <summary>
/// 获取错误页面的地址
/// </summary>
public string Url { get { return url; } }
/// <summary>
/// 获取错误描述
/// </summary>
public string Description { get { return description; } }
/// <summary>
/// 获取错误行号
/// </summary>
public int LineNumber { get { return lineNumber; } }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="url">错误网址</param>
/// <param name="description">错误描述</param>
/// <param name="lineNumber">错误行号</param>
public ScriptErrorEventArgs(string url, string description, int lineNumber)
{
this.url = url;
this.description = description;
this.lineNumber = lineNumber;
}
}
/// <summary>
/// 脚本错误事件
/// </summary>
public event EventHandler<ScriptErrorEventArgs> ScriptError;
*/
#endregion
/// <summary>
/// 拦截弹出窗口级别
/// </summary>
private PopupBlockLevel blockLevel;
/// <summary>
/// 页面列表
/// </summary>
private SequencePageList<WebPage> pageList;
/// <summary>
/// 拦截脚本错误
/// </summary>
private bool suppressError;
/// <summary>
/// 命令列表
/// </summary>
private Hashtable cmdList;
#region 属性
/// <summary>
/// 获取当前浏览器对象
/// </summary>
public WebBrowserEx Web
{
get
{
WebPage page = SelectedTab as WebPage;
if (page != null)
return page.Web;
return null;
}
}
/// <summary>
/// 获取或设置拦截弹出窗口级别
/// </summary>
public PopupBlockLevel BlockLevel
{
get
{
return blockLevel;
}
set
{
blockLevel = value;
if (BlockLevelChanged != null)
BlockLevelChanged(this, EventArgs.Empty);
}
}
/// <summary>
/// 获取或设置拦截脚本错误属性
/// </summary>
public bool SuppressError
{
get
{
return suppressError;
}
set
{
suppressError = value;
if (SuppressErrorChanged != null)
SuppressErrorChanged(this, EventArgs.Empty);
}
}
#endregion
#region 事件
/// <summary>
/// 拦截弹出窗口级别改变事件
/// </summary>
public event EventHandler BlockLevelChanged;
/// <summary>
/// 拦截脚本错误属性改变事件
/// </summary>
public event EventHandler SuppressErrorChanged;
/// <summary>
/// 后退状态改变事件
/// </summary>
public event EventHandler CanGoBackChanged;
/// <summary>
/// 前进状态改变事件
/// </summary>
public event EventHandler CanGoForwardChanged;
/// <summary>
/// 状态栏文本改变事件
/// </summary>
public event EventHandler StatusTextChanged;
/// <summary>
/// 跳转到网址完成事件
/// </summary>
public event WebBrowserNavigatedEventHandler Navigated;
/// <summary>
/// 下载进度改变事件
/// </summary>
public event WebBrowserProgressChangedEventHandler ProgressChanged;
/// <summary>
/// 网址改变事件
/// </summary>
public event EventHandler PageLocationChanged;
#endregion
#region SequencePageList
/// <summary>
/// 页面次序管理泛型类
/// </summary>
/// <typeparam name="T">泛型参数</typeparam>
protected class SequencePageList<T> : IDisposable where T : class
{
/// <summary>
/// 页面序列
/// </summary>
private List<T> list;
/// <summary>
/// 构造函数
/// </summary>
public SequencePageList()
{
list = new List<T>();
}
/// <summary>
/// 获取序列最顶层的页面
/// </summary>
/// <returns>最顶层的页面</returns>
public T GetTopPage()
{
if (list.Count > 0)
return list[list.Count - 1];
else
return null;
}
/// <summary>
/// 将指定的页面置于序列顶层
/// </summary>
/// <param name="page">要置顶的页面</param>
public void Select(T page)
{
if (page != null)
{
if (list.Contains(page))
{
list.Remove(page);
list.Add(page);
}
}
}
/// <summary>
/// 添加页面到序列最底层
/// </summary>
/// <param name="page">要添加的页面</param>
public void Add(T page)
{
if (page != null)
list.Insert(0, page);
}
/// <summary>
/// 从序列移除指定页面
/// </summary>
/// <param name="page">要移除的页面</param>
public void Remove(T page)
{
if (list.Contains(page))
list.Remove(page);
}
#region IDisposable Members
/// <summary>
/// 删除页面序列
/// </summary>
public void Dispose()
{
list.Clear();
}
#endregion
}
#endregion
/// <summary>
/// 构造函数
/// </summary>
public PagedWebBrowser()
{
InitializeComponent();
BlockLevel = PopupBlockLevel.None;
pageList = new SequencePageList<WebPage>();
cmdList = new Hashtable();
suppressError = false;
}
#region Protected
/// <summary>
/// 命令处理函数
/// </summary>
/// <param name="command">命令字符串</param>
/// <param name="web">浏览器对象</param>
protected void ProcessCommand(string command, WebBrowserEx web)
{
if (web == null)
return;
if (command == null)
{
web.Navigate("about:blank");
}
else
{
int i = command.IndexOf(" ");
if (i >= 0)
{
string type = command.Substring(0, i);
string param = command.Substring(i + 1);
if (cmdList.ContainsKey(type))
{
web.Navigate(Fitler(string.Format(cmdList[type] as string, param)));
return;
}
}
web.Navigate(command);
}
}
/// <summary>
/// 过滤字符串使其符合Query要求
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -