Windows Phone 提供基于桌面浏览器的 WebBrowser 控件。Windows Phone OS 7.1 的 WebBrowser 控件基于 Internet Explorer 9,且 Windows Phone 8 的 WebBrowser 控件基于 Internet Explorer 10。因此,与在 Windows Phone 8 上运行的手机相比,使用在 Windows Phone 7.5 运行的 WebBrowser 的控件的应用,其外观稍有不同。
WebBrowser 控件可以嵌入应用中并且使用它的原因很多,不仅限于以下原因:
● 显示网络中的 Web 内容。您可以构建一个应用,该应用只是由指向您网站的嵌入 WebBrowser 控件组成,在该控件外面有自定义标记。有关更多信息,请参见如何使用Windows Phone的WebBrowser控件显示网络中的 Web 内容。
● 显示静态的 Web 内容。可以将应用配置为在本地独立存储中保存的内容,然后在嵌入的 WebBrowser 控件中查看这些内容。有关更多信息,请参见如何使用 Windows Phone 的 WebBrowser 控件显示静态 Web 内容。
● 显示动态生成的 Web 内容。可以将 WebBrowser 控件指向应用代码中动态构造的 HTML 内容。有关更多信息,请参见如何使用Windows Phone的WebBrowser控件显示动态生成的 Web 内容。
默认情况下,脚本在 WebBrowser 控件中处于禁用状态。如果您想在控件中启用脚本,请将 IsScriptEnabled 属性设置为 true。可使用 InvokeScript 方法调用脚本。当 WebBrowser 控件中的 JavaScript 将字符串传递到托管的代码时,将发生 ScriptNotify 事件。
警告:当您在 XAML 中创建 WebBrowser 控件时,您必须为该控件的 System.Windows.FrameworkElement.Name 属性指定值,以便 Windows Phone 功能检测工具能够合理地检测和赋予应用正确的功能。有关 Windows Phone 功能检测工具的详细信息,请参见如何确定应用功能。
Windows8 中的WebView提供承载应用程序内 HTML 内容的 UI 元素。WebView 始终使用文档模式中 Internet Explorer 10。与WP8的WebBrowser类似,WebView可以显示网络中的 Web 内容、静态的 Web 内容以及动态生成的 Web 内容。具体使用方法我们稍后进行介绍。
需要注意的是,WebView 目前不支持某些 HTML5 功能,包括 AppCache、IndexedDB、对剪贴板的编程访问或地理位置。此外,WebView 不支持 ms-appdata: scheme,但是其支持 ms-appx-web: scheme
如果你想实现一个Web应用(或仅仅是一个网页)作为你应用中的一部分,你可以使用WebView来实现它。WebView是Android的View类的扩展,它允许你显示一个网页作为Activity布局的一部分。它不包含成熟的浏览器的一些功能,例如导航控制或输入栏。默认情况下,WebView显示一个网页。
一个使用WebView的很普遍的场合是当你想要在应用中提供需要时常更新的信息时,例如用户协议或用户手册。在Android应用当中,你能创建一个Activity它包含一个WebView,然后使用它你可以显示网上提供的文档。
另一个使用WebView的场合是:假如你的应用总是需要网络链接来获取数据并提供给用户,例如电子邮件。这时候,你能发现在应用中创建一个WebView并使用网页来显示用户数据,比执行网络请求,解析数据然后再渲染到Android布局当中更加方便。你只需要根据Android设备设计网页,然后在应用当中实现一个WebView然后载入刚刚设计的网页。
开发使用 WebBrowser 控件的应用程序时,考虑以下有关安全的最佳做法和信息:
● 从独立存储加载的内容或使用 NavigateToString(String) 方法动态加载的内容的处理方式不同于从网络加载的内容。从独立存储加载的内容或使用 NavigateToString 动态加载的内容没有跨站点限制,但从网络加载的内容有跨站点限制。因此,在从独立存储加载或使用 NavigateToString 动态加载不受信任的内容时应格外小心。
● 请注意传递给 InvokeScript(String) 方法的数据的敏感性。例如,隐私或位置数据不应该向不受信任的脚本代码公开。
● 不应该使用 WebBrowser 控件创建常规用途的浏览器应用程序,因为此 API 并未设计为支持此类应用程序所需的全部安全功能。
● WebBrowser 控件不提供查看 URL 或安全锁定图标的功能。
● 在 WebBrowser 控件中,用户不能从 https 页面导航到 http 页面。这不同于设备浏览器,在设备浏览器中用户可以从 https 页面导航到 http 页面。
● 应用程序不能与 Internet Explorer Mobile 共享 Cookie。
● 除非在应用程序中将 IsScriptEnabled 属性设置为 true,否则默认情况下在浏览器中禁用脚本。
● WebView 不是Control子类且没有控件模板。显示区域为Width和Height。
● WebView 具有其他 UI 区域特征,如控件无法呈现在 WebView 顶部。这问题的原因是如何处理窗口区域内部,尤其是输入事件是如何处理以及屏幕是如何绘制的。如果您要呈现 HTML 内容并且还要将其他用户界面元素放置在该 HTML 内容的顶部,则应使用WebViewBrush作为呈现区域。WebView 仍提供 HTML 源信息,您可通过元素名称绑定和 SourceName 属性引用该 WebView。WebViewBrush 没有此复盖限制。
● 如果要显示一个偶尔有交互的WebView(例如下拉列表或应用程序栏),可以在必要时临时隐藏 WebView 控件,将其替换为一个使用WebViewBrush填充的元素。然后,当重叠的内容不存在时,可以再次显示原始 WebView。
WebView 不支持许多像KeyDown、KeyUp和PointerPressed的UIElement事件。此问题的常见解决方法是将WebView.InvokeScript与 eval 一起使用以便使用 HTML 事件处理程序,以及使用WebView.ScriptNotify以便使用 HTML 事件处理程序的 window.external.notify 来通知应用程序。
可以通过将 WebBrowser (WebView)控件托管在应用程序中并使用其 Source 属性或 Navigate(Uri) 方法更改该控件的位置来实现该操作。
警告: 默认情况下,脚本在 WebBrowser 控件中处于禁用状态。如果您想在控件中启用脚本,请将 IsScriptEnabled 属性设置为 true。
以下代码示例显示如何从 .xaml 文件内部更新 WebBrowser (WebView)控件的 Source 属性:
Wp8:
<phone:WebBrowser Source="http://www.bing.com" />
Win8:
<WebView Source=" http://www.bing.com "/>
或者,如果在 .xaml 文件中为 WebBrowser (WebView)控件指定了一个名称,则可以从该代码隐藏文件内部更新 Source 属性。以下代码示例显示如何更新 WebBrowser 控件(在 .xaml 文件中已命名为 webBrowser1(webView1))的 Source 属性:
Wp8:
webBrowser1.Source = new Uri("http://www.bing.com", UriKind.Absolute);
Win8:
webView1.Source = new Uri("http://www.bing.com", UriKind.Absolute);
或者,也可以使用 WebBrowser(WebView)类的 Navigate(Uri) 方法来实现该目标:
Wp8:
webBrowser1.Navigate(new Uri("http://www.bing.com", UriKind.Absolute));
Win8:
webView.Navigate(new Uri("http://www.bing.com", UriKind.Absolute));
如果您选择调用方法而不是设置属性,那么请记住,如果WebBrowser控件尚不在可视化树中,则会引发 InvalidOperationException。为了避免这个问题,您可以向 Loaded 事件附加一个处理程序,以确保在调用该方法之前此控件位于可视化树中。
Wp8:
webBrowser1.Loaded += (object sender, RoutedEventArgs e) => { webBrowser1.Navigate(new Uri("http://www.bing.com", UriKind.Absolute)); };
示例
下面的示例演示如何创建 Web 请求并向该请求添加 Cookie。此示例还演示如何从 Web 响应提取 Cookie,如何将 Cookie 写入独立存储中的文件以及从独立存储中进行读取。运行此示例时,将在 TextBlock 控件中显示 System.Net.Cookie 值。
C#
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Net.Browser; using System.IO; using System.Text; using System.IO.IsolatedStorage; namespace CookiesEx { public partial class MainPage : PhoneApplicationPage { public MainPage() { InitializeComponent(); } private void button1_Click(object sender, RoutedEventArgs e) { InitializeWebRequestClientStackForURI(); ReadFromIsolatedStorage(); } private void InitializeWebRequestClientStackForURI() { // Create a HttpWebRequest. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("http://windowsteamblog.com/windows_phone/b/windowsphone/rss.aspx")); //Create the cookie container and add a cookie. request.CookieContainer = new CookieContainer(); // This example shows manually adding a cookie, but you would most // likely read the cookies from isolated storage. request.CookieContainer.Add(new Uri("http://windowsteamblog.com/windows_phone/b/windowsphone/rss.aspx"), new Cookie("id", "1234")); // Send the request. request.BeginGetResponse(new AsyncCallback(ReadCallback), request); } // Get the response and write cookies to isolated storage. private void ReadCallback(IAsyncResult asynchronousResult) { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; HttpWebResponse response = (HttpWebResponse) request.EndGetResponse(asynchronousResult); using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream isfs = isf.OpenFile("CookieExCookies", FileMode.OpenOrCreate, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(isfs)) { foreach (Cookie cookieValue in response.Cookies) { sw.WriteLine("Cookie: " + cookieValue.ToString()); } sw.Close(); } } } } private void ReadFromIsolatedStorage() { using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream isfs = isf.OpenFile("CookieExCookies", FileMode.OpenOrCreate)) { using (StreamReader sr = new StreamReader(isfs)) { tb1.Text = sr.ReadToEnd(); sr.Close(); } } } } } }
XAML
<phone:PhoneApplicationPage x:Class="CookiesEx.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"> <StackPanel x:Name="LayoutRoot" Width="390"> <Button Width="372" Height="173" Content="Click to send request" HorizontalAlignment="Left" x:Name="button1" Click="button1_Click" Margin="5"/> <TextBlock TextWrapping="Wrap" Foreground="{StaticResource PhoneForegroundBrush}" Height="267" Name="tb1" Width="382" FontSize="22" /> </StackPanel> </phone:PhoneApplicationPage>
WinRT对WebView的功能做了很多的限制,所以本身webview控件是获取不到cookie我们可以用HttpWebRequest的CookieContainer来完成cookie的设置。
在android里面,为使HttpClient中保存下来的Cookie设置到WebView组件里,让WebView也保持住Cookie状态,我们需要用到CookieSyncManager和CookieManager类。在webView调用webView.loadUrl方法之前做以下设置即可给WebView设置Cookie
{ InitializeComponent(); SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape; webBrowser1.Loaded += WebBrowser_OnLoaded; } private void WebBrowser_OnLoaded(object sender, RoutedEventArgs e) { SaveFilesToIsoStore(); webBrowser1.Navigate(new Uri("readme.htm", UriKind.Relative)); }
http://www.oschina.net/question/1397765_139246