博客園客戶端UAP開發隨筆 -- App連接云端內容的橋梁:WebView

當你辛苦的從網上爬下來一篇文章之后,怎么在你的應用內展示這些包含HTML標記的文章?如果你使用的是Javascript開發應用,恭喜你,直接塞進頁面就可以了,同時說明你很熟悉頁面開發,而現在windows也支持這種方式。但是對于使用XAML開發的應用怎么辦呢?我們還有WebView控件可以用。

越來越多的服務器端API返回的數據使用HTML了,所以我們也不得不對WebView多了解一些。

WebView有個Bug:放在Grid里時,最右側有一個pixel縫隙時隱時現。要小心,別讓PM抓住你的小辮子。另外,在一個App里大量使用WebView要小心內存。在Silverlight中,一個WebBrowser(不叫WebView)要占用大概30M吧,如果把Script disable掉可以省很多。在WinRT中情況就好多了,我開過6個WebView也就150M。

準備工作

WebView控件可以用來展示在線頁面,應用內的離線頁面,甚至是內存中拼接出來的html字符串也可以。下面我們介紹下這3個方式的使用:

首先在頁面上添加一個WebView控件和3個按鈕,這里需要注意的是,最好是吧WebView放在Grid中,因為這樣WebView默認會填充整個區域,而在StackPanel中則不行。

?

<Pagex:Class="WebViewTest.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:WebViewTest"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid><Grid.RowDefinitions><RowDefinition Height="1*"></RowDefinition><RowDefinition Height="50"></RowDefinition></Grid.RowDefinitions><WebView x:Name="wv" Margin="10,20"/><StackPanel Grid.Row="1" Orientation="Horizontal"><Button x:Name="online" Click="online_Click">在線頁面</Button><Button x:Name="offline" Click="offline_Click">應用文件</Button><Button x:Name="memory" Click="memory_Click">內存中</Button></StackPanel></Grid>
</Page>

跑起來之后,我們的頁面是下面的丑樣子,這是因為我們還沒加載內容。。。

01

展示在線頁面

??? 展示在線頁面是最基本的需求了,使用這個功能,你就可以做一個自定義的瀏覽器了。。

??? 這個功能實現非常簡單,我們在online_Click中添加一行代碼就可以了。

private void online_Click(object sender, RoutedEventArgs e){this.wv.Navigate(new Uri("http://www.microsoft.com"));}

如上面的代碼,我們只需要調用WebView的Navigate方法,傳入網頁的地址即可。現在點擊在線頁面按鈕,我們的應用有點瀏覽器的影子了。。

02

展示應用文件

?? 通常我們會在應用內使用離線的頁面文件來展示內容,比如一個幫助頁面,或者用來展示內容的頁面框架(這個之后會介紹)。

?? 這個功能的實現其實使用的方法和在線是一樣的,都是調用Navigate,只是在Uri上有區別,因為我們要使用的是應用內的文件,這里我們需要在構造Uri的時候,使用ms-appx-web這個Uri Scheme,更多關于Uri Scheme的內容,請點擊這里。

private void offline_Click(object sender, RoutedEventArgs e){// ms-appx-web 表示我們要讀取的是應用內的一個文件,并且是在Web區域,相對路徑是Data/help.html, this.wv.Navigate(new Uri("ms-appx-web:///Data/help.html"));}

03

展示內存中字符串的內容

private void memory_Click(object sender, RoutedEventArgs e){var html = "&lt;h1&gt;我是一個字符串&lt;/h1&gt;";this.wv.NavigateToString(html);}

04

和dom交互

使用WebView我們可以很方便的展示HTML頁面,但是如果我們想要對dom做一些操作的話,還是需要使用javascript,比如調節字體大小,顏色等。這里用到的是InvokeScriptAsync方法,這個方法異步調用頁面內指定的javascript方法。

首先為之前的幫助頁面添加一個方法changeColor,用來修改h2的字體顏色:

<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head><meta charset="utf-8" /><title></title><script>function changeColor(){document.getElementsByTagName("h2")[0].style.color = "red";}</script>
</head>
<body><h2>這是個幫助頁面</h2><p>這里是幫助內容</p>
</body>
</html>

然后在主頁面上添加一個按鈕(方法同前,這里就略過了),在點擊事件中調用這個方法:

private async void runCustomScript_Click(object sender, RoutedEventArgs e){// 第一個參數是頁面內的方法名,第二個是傳入的參數列表,這個例子沒有用到,這里用來演示下怎么用await wv.InvokeScriptAsync("changeColor", new []{"arg1", "arg2"});}

點擊之后,我們標題就紅了。

在前面的代碼中,其實存在一個潛在的問題,如果我們頁面有點復雜,在dom還沒有加載分析完成的時候,方法changeColor或標題可能還不存在,這樣我們的調用不但不會有效果,還會引起異常。

所以需要在進行dom相關操作之前確認頁面已經加載分析完成,WebView.DOMContentLoaded這個事件是在dom文檔分析完成之后觸發的,這樣我們所有的dom操作就不會有錯了。

public sealed partial class MainPage : Page{protected override void OnNavigatedTo(NavigationEventArgs e){}private void online_Click(object sender, RoutedEventArgs e){this.wv.Navigate(new Uri("http://www.microsoft.com"));}private void offline_Click(object sender, RoutedEventArgs e){// ms-appx-web 表示我們要讀取的是應用內的一個文件,并且是在Web區域,相對路徑是Data/help.html, this.wv.Navigate(new Uri("ms-appx-web:///Data/help.html"));}private void memory_Click(object sender, RoutedEventArgs e){var html = "&lt;h1&gt;我是一個字符串&lt;/h1&gt;";this.wv.NavigateToString(html);}public MainPage(){this.InitializeComponent();this.NavigationCacheMode = NavigationCacheMode.Required;this.wv.DOMContentLoaded += wv_DOMContentLoaded;}// 我們新加入一個變量,用來標識當前頁面是否分析完成bool domLoaded = false;void wv_DOMContentLoaded(WebView sender, WebViewDOMContentLoadedEventArgs args){domLoaded = true;}private async void runCustomScript_Click(object sender, RoutedEventArgs e){if (domLoaded){// 第一個參數是頁面內的方法名,第二個是傳入的參數列表,這個例子沒有用到,這里用來演示下怎么用await wv.InvokeScriptAsync("changeColor", new[] { "arg1", "arg2" });}}}

使用模板頁

現在如果你把頁面的內容加的更多一些的話,你會發現WebView有一小段時間是空白的,這個就是在頁面分析渲染完成之前的間隙。。。

要解決這個問題,我們可以先讓WebView加載下面這樣一個很小的模板頁。

<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head><meta charset="utf-8" /><title></title><script>function setContent(content){var container = document.getElementById("container");container.innerHTML = content;}</script>
</head>
<body><div id="container"></div>
</body>
</html>

這個模板頁里只有一個簡單框架和一個用來填充內容的方法,因為模板頁很小且是本地的,所以加載渲染的很快,不會有白色的閃爍。然后通過調用javascript方法來把內容寫入到dom中。

private async void runCustomScript_Click(object sender, RoutedEventArgs e){if (domLoaded){await wv.InvokeScriptAsync("setContent", new[] { "&lt;h2&gt;我是一個有很多內容的html頁面,真的很多。。。&lt;/h2&gt;"});}}

小結

以上介紹了使用WebView的基本方法,還有一些別的技巧我們以后再說,比如調整成夜間模式,比如檢測手勢左右滑動,比如監測頁面跳轉......哎,有的公司就是靠這些技巧用WebView控件包裝一下做了瀏覽器,但是可悲(或者可笑)的是,一些用戶還在評論中說:不錯,速度很快,流暢。除非有服務器端的數據壓縮,否則能快到哪里去呢?

分享代碼,改變世界!

Windows Phone Store App link:

http://www.windowsphone.com/zh-cn/store/app/博客園-uap/500f08f0-5be8-4723-aff9-a397beee52fc

Windows Store App link:

http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059

GitHub open source link:

https://github.com/MS-UAP/cnblogs-UAP

MSDN Sample Code:

https://code.msdn.microsoft.com/CNBlogs-Client-Universal-477943ab

轉載于:https://www.cnblogs.com/ms-uap/p/4274484.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257652.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

listview與gridview點擊時的背景色取消

在布局文件里面的listview控件添加以下代碼android:listSelector"#00000000" //透明色 可以自己選擇點擊顏色轉載于:https://www.cnblogs.com/yulook/p/5219932.html

解決yum命令失效,vim: command not found

安裝python3模塊時&#xff0c;yum命令無法執行錯誤:**/usr/bin/yum: line 3: import: command not found/usr/bin/yum: line 4: try:: command not found/usr/bin/yum: line 5: import: command not found/usr/bin/yum: line 6: except: command not found/usr/bin/yum: line …

C4.5

C4.5是機器學習算法中的另一個分類決策樹算法&#xff0c;它是基于ID3算法進行改進后的一種重要算法&#xff0c;相比于ID3算法&#xff0c;改進有如下幾個要點&#xff1a; 用信息增益率來選擇屬性。ID3選擇屬性用的是子樹的信息增益&#xff0c;這里可以用很多方法來定義信息…

(周日賽)Sort the Array

題意&#xff1a;一段數字&#xff0c;逆置其中兩個使其遞增 DescriptionBeing a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a…

jqgrid學習(三)

1.修改jqgrid自帶的行編輯按鈕樣式 //jqgrid默認的行編輯樣式 {name : ,index : ,width : 70,fixed : true,sortable : false,resize : false,formatter : actions,},//修改每行的編輯按鈕圖標為目標樣式//當表格中數據加載完畢后&#xff0c;執行此方法 loadComplete : functi…

事件Event對象

事件event對象 當事件發生時&#xff0c;會向調用函數傳遞一個event對象&#xff0c;event對象記錄當前事件發生時的環境信息。 一個事件只能對應一個event對象&#xff0c;并且event對象是短暫存在的。 DOM中的event對象的使用方法 1、在HTML標記中&#xff0c;通過事件來調用…

解決mac osx下pip安裝ipython權限的問題

1pip install ipython --user -U下面是pip install gevent的錯誤提示&#xff0c; 又是 Operation not permitted … 12345#xiaorui.ccpip install gevent...raise Error, errorsError: [(/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_marker…

談談分布式事務之三: System.Transactions事務詳解[下篇]

在前面一篇給出的Transaction的定義中&#xff0c;信息的讀者應該看到了一個叫做DepedentClone的方法。該方法對用于創建基于現有Transaction對 象的“依賴事務&#xff08;DependentTransaction&#xff09;”。不像可提交事務是一個獨立的事務對象&#xff0c;依賴事務依附于…

HDU——2444 The Accomodation of Students

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)                    Total Submission(s): 7086 Accepted Submission(s): 3167 Problem DescriptionThere are a group of studen…

iOS開發系列--觸摸事件、手勢識別、搖晃事件、耳機線控

-- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點觸摸的強大功能&#xff0c;喬布斯讓人們認識到手機其實是可以不用按鍵和手寫筆直接操作的&#xff0c;這不愧為一項偉大的設計。今天我們就針對iOS的觸摸事件&#xff08;手勢操作&#xff09;、運動事件、遠程控制…

關于Hyper-V備份的四大注意事項

盡管Hyper-V備份相對簡單&#xff0c;但備份管理員仍需注意四大問題。這四方面的問題在創建備份時可能不太重要&#xff0c;但在備份恢復時影響甚大。 1、對于虛擬機來說不僅意味著虛擬磁盤 就目前來看&#xff0c;企業在執行Hyper-V備份時最常見的誤區就是把虛擬機當做物理服務…

python為什么忽然火了_為什么Python突然就火了起來了呢?

近日&#xff0c;TIOBE發布10月編程語言排行榜顯示&#xff0c;15年來TIOBE指數的前8名一直保持不變&#xff0c;而Python正在成為一種新的大型語言。越來越多的企業在使用Python進行開發&#xff0c;越來越多的人正在加入Python程序員行列!TIOBE 10月編程語言排行榜前20名Pyth…

SQL 2005 全文索引

全文索引技術是目前搜索引擎的關鍵技術。 試想在1M大小的文件中搜索一個詞&#xff0c;可能需要幾秒&#xff0c;在100M的文件中可能需要幾十秒&#xff0c;如果在更大的文件中搜索那么就需要更大的系統開銷&#xff0c;這樣的開銷是不現實的。 所以在這樣的矛盾下出現了全文索…

python重命名窗口_Python:即時重命名方法名稱

如果要繼續在已切換到使用屬性的對象上使用get_Field和set_Field(您只需訪問或分配給Field),則可以使用包裝器對象&#xff1a;class NoPropertyAdaptor(object):def __init__(self, obj):self.obj objdef __getattr__(self, name):if name.startswith("get_"):retu…

nginx優化之請求直接返回json數據

對于有些服務端接口返回是固定值的json&#xff0c;可通過配置nginx直接返回json&#xff0c;減少程序的加載對資源的占用&#xff0c;減少接口響應時間 location ~* (request/update)$ { default_type application/json; return 200 {"update":"no&quo…

ARP掃描工具arp-scan

2019獨角獸企業重金招聘Python工程師標準>>> ARP掃描工具arp-scan arp-scan是Kali Linux自帶的一款ARP掃描工具。該工具可以進行單一目標掃描&#xff0c;也可以進行批量掃描。批量掃描的時候&#xff0c;用戶可以通過CIDR、地址范圍或者列表文件的方式指定。該工具…

數據庫索引的作用和優點缺點

為什么要創建索引呢&#xff1f;這是因為&#xff0c;創建索引可以大大提高系統的性能。 第一&#xff0c;通過創建唯一性索引&#xff0c;可以保證數據庫表中每一行數據的唯一性。 第二&#xff0c;可以大大加快 數據的檢索速度&#xff0c;這也是創建索引的最主要的原因。 第…

elementui el-from 怎樣顯示圖片_vue2.0使用weui.js的uploader組件上傳圖片(兼容移動端)...

本文已同步到專業技術網站 www.sufaith.com, 該網站專注于前后端開發技術與經驗分享, 包含Web開發、Nodejs、Python、Linux、IT資訊等板塊.最近在使用 vue2.0開發微信公眾號網頁 其中涉及到 選擇圖片, 圖片的壓縮上傳, 預覽, 刪除等操作。項目整體UI框架使用的是 vux, 但可惜的…

面向對象分析

在需求獲取階段&#xff0c;開發人員關注于理解用戶以及他們的使用要求。而在需求分析階段&#xff0c;開發人員關注于理解系統需要構建的內容&#xff0c;其核心是產生一個準確的、完整的、一致的和可驗證的系統模型&#xff0c;稱為分析模型。 面對對象的分析模型由三個獨立的…

python字典輸入學生信息_如何用Python將XML中的所有信息輸入字典

我通常使用標準庫中的ElementTree模塊解析XML。它沒有給你一個字典&#xff0c;你得到了一個更有用的DOM結構&#xff0c;它允許你為孩子們遍歷每個元素。from xml.etree import ElementTree as ETxml ET.parse("root_element xml.getroot()for child in root_element:.…