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加密 优质内容筛选与推荐>>