今天完成了webbrowser html和page之间的导航。
1、创建history类,里面包含2个stack存储前进和后退地址。 html的地址为uri类型,page的地址就是page实例(这样保证只有唯一page的实例存在)。
2、在webbrowser loadcompleted或者frame导航时,把地址加到history里。
3、在实现前进后退功能时,从page导航到html或者html导航到page,要注意frame的操作。
类的实现如下:
class History
{
public History(Frame frame, WebBrowser webbrowser)
{
backStack = new Stack<object>();
forwardStack = new Stack<object>();
m_frame = frame;
m_nowType = null;
m_webbrowser = webbrowser;
}
public void operatorNavigate( object previousType)
{
if (m_nowType is Uri)
{
if (previousType is Uri)
{
m_webbrowser.Navigate((Uri)m_nowType);
}
else
{
m_frame.Navigate(m_webbrowser);
m_webbrowser.Navigate((Uri)m_nowType);
}
}
else
{
m_frame.Navigate(m_nowType);
}
}
public bool GoBack()
{
if (CanGoback())
{
forwardStack.Push(m_nowType);
m_nowType = backStack.Pop();
operatorNavigate(forwardStack.Peek());
return true;
}
return false;
}
public bool GoForward()
{
if (CanGoForward())
{
backStack.Push(m_nowType);
m_nowType = forwardStack.Pop();
operatorNavigate(backStack.Peek());
return true;
}
return false;
}
public (object type)
{
if (m_nowType != null)
backStack.Push(m_nowType);
m_nowType = type;
forwardStack.Clear();
}
public bool CanGoback()
{
if (backStack.Count > 0)
return true;
return false;
}
public bool CanGoForward()
{
if (forwardStack.Count > 0)
return true;
return false;
}
private Stack<object> backStack { get; set; }
private Stack<object> forwardStack { get; set; }
public object m_nowType { get; set; }
private Frame m_frame;
private WebBrowser m_webbrowser;
}