为WebBrowser控件添加后退和前进按钮

本文关键字:按钮 WebBrowser 控件 添加 | 更新日期: 2023-09-27 18:12:05

我在页面中有一个WebBrowser元素,我想在其中添加一个后退和前进按钮,并在没有后退和前进时禁用这些按钮。

在Cocoa中,UIWebView有方法可以很容易地检查:canGoBack和canGoForward,你有goBack和goForward方法可用(连同reload等)

Android有完全相同的方法名来实现相同的。

我看到这些方法在。net 4和3.5 SP1中可用。

我找到了一些关于在Silverlight中使用javascript命令的参考资料,但我发现这非常麻烦,而且没有办法检测历史中是否有任何东西(当然,除非我自己管理)

当然,Windows Phone有更高级的东西…

为WebBrowser控件添加后退和前进按钮

我是这样做的

假设您已经设置了backButtonforwardButton;这些按钮的状态将根据您在导航堆栈中的位置相应地更新。

webViewWebBrowser对象

List<Uri> HistoryStack;
int HistoryStack_Index;
bool fromHistory;
// Constructor
public HelpView()
{
    InitializeComponent();
    HistoryStack = new List<Uri>();
    HistoryStack_Index = 0;
    fromHistory = false;
    webView.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(WebView_Navigated);
    UpdateNavButtons();
}
private void backButton_Click(object sender, RoutedEventArgs e)
{
    if (HistoryStack_Index > 1)
    {
        HistoryStack_Index--;
        fromHistory = true;
        webView.Navigate(HistoryStack[HistoryStack_Index-1]);
        updateNavButtons();
    }
}
private void forwardButton_Click(object sender, RoutedEventArgs e)
{
    if (HistoryStack_Index < HistoryStack.Count)
    {
        HistoryStack_Index++;
        fromHistory = true;
        webView.Navigate(HistoryStack[HistoryStack_Index-1]);
        UpdateNavButtons();
    }
}
private void UpdateNavButtons()
{
    this.backButton.IsEnabled = HistoryStack_Index > 1;
    this.forwardButton.IsEnabled = HistoryStack_Index < HistoryStack.Count;
}
private void WebView_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    if (!fromHistory)
    {
        if (HistoryStack_Index < HistoryStack.Count)
        {
            HistoryStack.RemoveRange(HistoryStack_Index, HistoryStack.Count - HistoryStack_Index);
        }
        HistoryStack.Add(e.Uri);
        HistoryStack_Index++;
        UpdateNavButtons();
    }
    fromHistory = false;
}

我有一个后退按钮添加到一个页面的应用程序栏在我的一个应用程序,其中包含一个网页浏览器。我希望应用程序栏中的后退按钮能够向后引导网页导航,并希望硬件后退按钮能够转到上一个xaml页面。这样,用户就不必使用硬件后退按钮在浏览器中向后浏览所有访问过的网页,以便返回到先前的xaml页面。我是这样做的,你可以很容易地设置一个前向堆栈,当用户点击后退(appbar)按钮时,页面从堆栈弹出并被推到前向堆栈。

        private void NavigateWeb()
        {
              if (!loaded)
              {
                    NavigationStack.Clear();
                    try
                    {
                          Web.Source = new Uri("http://m.weightwatchers.com/");
                          loaded = true;
                    }
                    catch (Exception ex)
                    {
                          MessageBox.Show("Unable to navigate to page.'n" + ex.Message,
                                "Error", MessageBoxButton.OK);
                    }
              }
        }
        void Web_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
        {
              NavigationStack.Push(e.Uri);
        }

        void btnBack_Click(object sender, EventArgs e)
        {
              if (NavigationStack.Count > 2)
              {
                    // get rid of the topmost item...
                    NavigationStack.Pop();
                    // now navigate to the next topmost item
                    // note that this is another Pop - as when the navigate occurs a Push() will happen
                    Web.Navigate(NavigationStack.Pop());
              }
        }

我检查NavigationStack的原因。Count> 2是我在网页浏览器中显示的特定网页总是以第一页上的"点击这里继续"链接开始,并且没有理由回到那里。这就是在你的浏览器中显示别人的网站的缺点——你无法控制显示的内容。

关于javascript解决方案,它是这样做的:

    private void backButton_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            webView.InvokeScript("eval", "history.go(-1);");
        }
        catch
        {
            // Eat error
        }
    }
    private void forwardButton_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            webView.InvokeScript("eval", "history.go(1);");
        }
        catch
        {
            // Eat error
        }
    }

将WebBrowser元素的IsScriptingEnabled设置为true。然而,这总是会生成错误80020006的异常。我读了各种关于DOCTYPE如何成为罪魁祸首的帖子,系统缓存或IsScriptEnabled在内容加载后被设置…