【问题标题】:How to handle a Web Browser back and forward navigation in a Wp7 app如何在 Wp7 应用程序中处理 Web 浏览器的前后导航
【发布时间】:2012-01-27 08:14:57
【问题描述】:

我在我的 windows phone 7 应用程序中使用网络浏览器。 我只想知道如何处理它的前后导航,就像任何桌面浏览器一样。 以及如何阻止特定的导航。

我推荐了here 和许多其他人,但找不到任何适合我的东西。 请帮忙。

【问题讨论】:

    标签: c# windows-phone-7 windows-phone-8


    【解决方案1】:

    您可以通过处理 OnNavigating 事件来取消导航

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        //cancel navigation
         e.Cancel = true;
    
    }
    

    要返回,可以在页面上执行javascript。

    webBrowser.InvokeScript("eval","history.go(-1)");
    

    然后继续前进:

    webBrowser.InvokeScript("eval","history.go(1)");
    

    如果eval 在页面上被阻止,this site 可能对替代方案有用。不要忘记将webBrowser.IsScriptEnabled 设置为true

    【讨论】:

    • 我想在点击我的停止按钮时停止导航如何调用这个?
    • 无论出于何种原因,WinForm 的 WebBrowser 控件上的 Stop 方法已从 Silverlight 中删除。我认为没有直接的方法可以立即停止所有待处理的导航。作为一种我没有尝试过的 hack,您可以禁用然后重新启用 WebBrowser 控件。或者,您可以重新加载用户当前所在的页面。另一种选择可能是处理 Javascript 的 onUnload 方法,但我不知道这是否可行。
    • 我使用history.go来回退,效果很好,但我不知道是否可以回退!(禁用或启用后退或前进按钮)
    • 仅供参考:从stackoverflow.com/questions/8625037/…合并到这个问题中
    【解决方案2】:

    要使其像桌面浏览器一样工作,您可以实现stack

    您将前后放置两个按钮。当用户在浏览器中导航到下一个 URL 时,您将它们推入 历史堆栈,当他想通过按返回按钮返回时,您导航到历史堆栈中的第一个 url以编程方式将其从 历史堆栈 中弹出,这样他就可以向后导航,直到堆栈中有一些 URLs 在其中。同样,对于向前,您将 URLs 推入 forward stack,因为他向后导航,并且每当他按下向前按钮时,您都会导航到 forward stack 中的第一个元素,并且弹出它,以此类推,直到您在 forward stack 中留下 url。一旦他导航到您未从 前向堆栈 导航的某个 url,然后您清空前向堆栈并在他向后移动时再次填充它。

    通过这种方式,您甚至可以在列表中显示历史 url,或者您喜欢的任何方式。

    关于取消导航,这是您问题下的 cmets 中问题链接中的代码,它应该可以工作。

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        //cancel navigation
         e.Cancel = true;
    
    }
    

    【讨论】:

      【解决方案3】:

      之前的答案会起作用,但您可以使可行的解决方案更加简单,因为 WebBrowser 控件具有内部导航堆栈。

      在您的 UI 中添加前进和后退按钮控件。在他们每个人的动作例程中:

      private void forwardButton_Click(object sender, System.Windows.RoutedEventArgs e)
      {
                  WebBrowser editWB = sender as WebBrowser;
                  if (editWB != null && editWB.CanGoForward)
                      editWB.GoForward();
      }
      

      您可以更有趣:在WebBrowser.LoadComplete 事件(不是FrameworkElement.Loaded 事件)中,您可以测试 .CanGoForward 和 .CanGoBack 并有选择地适当地启用或禁用按钮。

      【讨论】:

        【解决方案4】:

        我尝试实现 BobHy 提出的想法,但失败了,因为在我的 WP7 / VS2010 Express 中我没有找到用于 WebBrowser 的方法 CanGoForward。我在用户控件的画布内使用它,这可能会影响体验。

        但是,我在 http://developer.nokia.com/community/wiki/WebBrowser_Control_Techniques_in_Windows_Phone 找到了一个直接详细的示例,它按照 Parveen 的建议实现了一个对我很有效的堆栈。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-23
          相关资源
          最近更新 更多