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

时间:2011-10-24 09:34:44

标签: c# silverlight windows-phone-7

我在页面中有一个WebBrowser元素,我想在其中添加一个后退和前进按钮,并且在没有任何内容可以返回时禁用这些按钮。

在Cocoa中,UIWebView有方法可以轻松检查:canGoBack和canGoForward,并且你可以使用goBack和goForward方法(以及重载等)。

Android具有完全相同的方法名称。

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

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

当然,Windows Phone中有一些更先进的东西..

3 个答案:

答案 0 :(得分:7)

以下是我最终如何做到这一点。

这假设您设置了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;
}

答案 1 :(得分:2)

我的一个应用程序中的一个页面的应用程序栏中添加了一个后退按钮,其中包含一个webbrowser。我希望应用栏中的后退按钮向后进行网页导航,并希望硬件返回按钮转到上一个xaml页面。这样,用户不必使用硬件后退按钮来向后导航webbrowser中的所有访问过的网页,以便返回到先前的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&gt;的原因2我在webbrowser中显示的特定网页总是以第一页上的“点击此处继续”链接开始,没有理由回到那里。这是在您的网络浏览器中显示其他人的网站的垮台 - 您无法控制所显示的内容。

答案 2 :(得分:0)

关于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
        }
    }

将WebSrowser元素的IsScriptingEnabled设置为true。 但是,这总是会生成一个错误80020006的异常。我阅读了有关DOCTYPE如何成为罪魁祸首的各种帖子,系统缓存或IsScriptEnabled在内容加载后设置......它只是从来没有工作......