webbrowser解决页面导航问题

一、获取webbrowser里面的链接(我写的是获取href的内容,也就是http://baidu.com)

  其实很简单,是我想复杂了,webbrowser控件有2个方法,navigating和navigated方法,点击控件里面别的链接,要离开页面的时候,需要的是navigating方法,这个时候我们传一个值:

private void wb_Navigating(object sender, NavigatingEventArgs e)
{
navigatingURL = e.Uri.ToString();//获取到我们点击的值,并把它转化成字符串。

NavigationService.Navigate(new Uri("/landscapepage.xaml?id="+navigatingURL, UriKind.Relative));//注意传参的时候:id=1,则传到另一个界面1(如果写id=navigatingURL ,则传到第二个界面的是navigatingURL 这个字符串本身,而不是其数值),如果“id=”+Value,则传过去的是value,就是navigatingURL了,现在我们传到另一个界面的是字符串“http://baidu.com”


string html = "<a href='http://www.baidu.com' target='_blank'><img src='Images/1.jpg' width='100' height='100'>点击查看详细数据</a><b>hellow</b>";
wb.NavigateToString(ConvertExtendedASCII(html));//工程加载(初始化)的时候其实已经传过来一次了,重新写一次,不然本页的webbrowser当返回的时候,也会导航到标签链接的那个页面。(href的链接一定不要写错了,多一个/,都会在传参的时候出现错误,在另一个界面就多了个“about:/”)

 ProgBar.Visibility = Visibility.Visible;//前台加个prograssbar,当正在跳转的时候显示不定性的prograssbar(xaml代码):<ProgressBar Foreground="Orange" x:Name="ProgBar" Visibility="Collapsed" IsIndeterminate="True" Height="4" HorizontalAlignment="Left" VerticalAlignment="Top" Width="460" />

}

二、接受页面:这个页面比较简单了,重写一下导航到本页面的参数就行了。接参数是参考的msdn第七项:http://social.msdn.microsoft.com/Forums/zh-CN/5aacf6ab-dab7-4dcc-9d3d-d2c9095e490e/windows-phone-7-

protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
String id=NavigationContext.QueryString["id"];
tb.Text = id;
}

三、关于跳转的时候进度条问题

1.基本场景:跳转完了,prograssbar也就跟着消失了。如果页面不跳转到别的页面的话,在当前页面继续加载,这个时候就用到了这个设置了。

private void wb_Navigated(object sender, NavigationEventArgs e)
{
ProgBar.Visibility = Visibility.Collapsed;

}

2.特殊场景:用户如果快速操作,这个时候如果操作进度条,有可能导致webview崩溃,

原因:操作了“当前页面的进度条”

解决方案:可以在LoadCompleted这个方法里用try catch处理,

private void WBrowser_OnLoadCompleted(object sender, NavigationEventArgs e)
        {
            try
            {
                var str1 = WBrowser.SaveToString();
                GetProgressBar(false);//界面如果已经跳转,这句会报错
            }
            catch (Exception)
            {
            }
        }
进度条处理

四、关于http传参

鉴于httpwebrequest的时候;url中特殊含义的字符会被特殊解析,所以用key-value传参数值(注意不是参数名)时,要统一进行httputility.urlencode(url)转码。 

  //签名验证
      public static string[] Sign(Dictionary<string, string> paraDictionary)
      {
          var list = new List<string>();
          string list1 = "";
          foreach (var kv in paraDictionary)
          {
              list.Add(String.Format("{0}{1}", kv.Key, kv.Value));
              //注意这里,对返回参数的值进行编码
              list1 += String.Format("{0}={1}&", kv.Key, HttpUtility.UrlEncode(kv.Value));
          }
          list.Sort();
          string tmp = list.Aggregate("", (current, kvstr) => current + kvstr);
          string sign = Hmac(tmp);
          string[] arrStrings = { list1, sign };
          return arrStrings;
      }
签名验证

  五、HMAC加密算法:

      private static string Hmac(string list)
      {
          byte[] byte1 = Encoding.UTF8.GetBytes(Publickey);
          byte[] byte2 = Encoding.UTF8.GetBytes(list);
          var hmac = new HMACSHA1(byte1);
          byte[] hashValue = hmac.ComputeHash(byte2);
          string hasvale1= Convert.ToBase64String(hashValue);
          return hasvale1;
      }
hmac加密

 

posted on 2013-06-25 18:14  鸣动我心  阅读(1274)  评论(0编辑  收藏  举报