本文將重點講解如何為特定的硬件設備自定義 Web移動程序以及使用模板自定義Form和Panel等控件通過屬性重寫這個特性使ASPNET Web移動程序可以根據移動設備的硬件功能為特定的硬件指定其控件的屬性值例如應用程序可能需要一個Label控件在一些設備上顯示較長的文本而在另一些設備上顯示較簡短的文本這就需要我們為每個控件都提供一組屬性應用程序可以針對各個設備重寫這些屬性所有的ASPNET移動控件都具有默認的外觀和布局對於ASPNET移動控件你可通過設置屬性或使用樣式來改變移動控件的默認外觀你還可以使用模板自定義某些移動控件的外觀本章還將重點介紹模板和模板集以及它們的使用方法
自定義的方式
在前面的幾個專題中我們提過如何使用設備篩選器為特定設備進行自定義除此之外我們還可以使用模板化技術和屬性重寫功能使你可以自定義你的應用程序以便對特定的設備類型以不同的方式呈現控件如果你在aspx頁面中為一個控件使用上述的任何一種自定義方法都可以使用一個名為DeviceSpecific/Choice構造的移動控件語法DeviceSpecific/Choice構造通常是為特定於設備的選項模板集以及控件內在多個備選內容之間指定一個選項例如下面的代碼是一個Label控件的聲明語法在這個聲明中包含了一個用來鑒別當前浏覽器是否支持HTML的DeviceSpecific/Choice構造
<mobile:Label id=Label runat=server Text=Default text>
<DeviceSpecific>
<Choice Filter=isHTML Text=Text for selected devices ></Choice>
</DeviceSpecific>
</mobile:Label>
其中Filter屬性指定了一個設備篩選器該設備篩選器其名稱為isHTML它用來鑒別一個移動設備是否內置了HTML浏覽器如果內置了HTML浏覽器的話將會在Label控件上應用Text for selected device這段文本相反的就不作任何的顯示正如上述的代碼所示在<DeviceSpecific></DeviceSpecific>內通常包含一個或多個<Choice>元素每個元素都包含指定如何根據目標設備功能計算選項的屬性運行時依次計算每個選項並使用成功計算出的第一個選項(這和C#裡的switch case語句非常相似)
在開始學習如何定義一個設備篩選器前先讓我們先了解一些基本的概念例如屬性重寫和模板化的具體含義
屬性重寫
一般情況下我們開發的ASPNET Web移動程序並不是針對某個具體的設備而是可以根據移動設備硬件特性的不同通過適應性的調整從而可以在幾乎所有的硬件設備上進行良好的呈現
但是因為品牌和型號的不同這些移動設備間就不可避免地存在一些差異例如支持的顏色屏幕大小輸入功能以及浏覽器使用的標記語言等前面提到過ASPNET控件是可以被幾乎所有的硬件設備支持的因為它們本身就具有適應性調整的功能而且控件設置的屬性值也會伴隨ASPNET控件應用到具體的應用程序中並不會因為硬件設備的不同使屬性值不同但是在某些情況下你可能捨棄默認的呈現采用自定義的呈現方式一個典型的例子就是字符的顯示例如我們使用Label控件進行字符串的顯示在一些屏幕較小的設備上每一行顯示的字符數也是較少的因此我們可以為該控件的Text屬性設置為我們使用ASPNET而針對一些大屏幕的設備我們可以將Label控件的Text屬性設置為我們使用ASPNET構建一個功能完善的移動應用程序正是因為屬性重寫功能我們才可以使用上述的方法來構建一個針對不同移動設備的硬件特性做出最好呈現的ASPNET Web移動應用程序
模板
FormPanelList和ObjectList等移動控件都是模板化的控件開發人員通常使用模板來改變或豐富應用程序的外觀或內容例如如果為Form控件指定並選擇了頁眉或頁腳模板則該模板中包含的標記將被添加到窗體內容中分別作為頁眉或頁腳進行呈現請注意模板不同於樣式模板定義要顯示的內容和控件當應用程序呈現模板附加到的控件時即會呈現模板而樣式指定內容和控件的外觀您的應用程序可在不使用模板的情況下使用樣式它也可在模板內將樣式應用於您定義的移動控件 除了模板外ASPNET移動控件在此基礎上還擴展了一個新的模型並引入了模板集的概念模板集是由模板組成的集合但是單個模板化控件可能引用多個模板集而每個模板集都具有不同的特定於設備的條件模板集的具體實現將在後續章節具體介紹
設備篩選器詳解
使用設備篩選器應用程序可為特定硬件設備或設備類別自定義控件的外觀該自定義基於用來浏覽應用程序的硬件設備的功能 例如假設開發人員正在開發主要用於支持位圖 (bmp) 圖像的特定品牌手持式設備的應用程序在此設備上開發人員決定同時用來自bmp文件的文本和圖標顯示List控件中的所有項通過使用設備篩選器應用程序可檢測到它是否正在目標手持式設備上被用戶浏覽這會導致應用程序使用同時用文本和圖標顯示列表項的設備特定的模板此技術可為特定硬件設備自定義應用程序進一步擴充此示例假設您還希望可在顯示gif圖像的任意類型設備上浏覽該應用程序您的應用程序可應用檢測程序何時在此類設備上使用的設備篩選器在該情況下該程序指定使用文本和列表項圖標的 gif 圖像(而不是bmp圖像)顯示列表項的模板這就為一類設備自定義了應用程序
設備篩選器可完成的一些其他任務包括
■ 根據設備類型選擇樣式
■ 在支持使用更為豐富的表現形式呈現控件的設備上我們可以盡量利用該硬件設備的 性能使用一些更加細致的具體的呈現方式
■ 在顯示功能受限制的設備上使用更為簡單的表現形式呈現控件
在DeviceSpecific/Choice構造中的<Choice>元素依賴於移動設備的功能當你使用某移動設備請求一個ASPNET移動頁面時首先就會將包含該移動設備型號和內置浏覽器等信息通過HTTP文件頭傳送到服務器端這時服務器就會根據HTTP文件頭傳送的這些信息構建一個SystemWebMobileMobileCapabilities對象以此來響應客戶端請求而設備篩選器就是利用MobileCapabilities對象的一些只讀屬性進行工作的一個典型的例子就是設備篩選器如何鑒別那些支持HTML 標記語言的浏覽器實現這種鑒別就是檢測和客戶請求相關的MobileCapabilities對象的PreferredRenderingType屬性值是否為html是的話就是支持HTML 標記語言的浏覽器
注意MobileCapabilities對象的各個屬性是和浏覽頁面的移動設備戚戚相關的例如當使用Pocket Internet Explorer浏覽器請求頁面時MobileCapabilities對象的Browser屬性將被設置為Pocket IE PreferredRenderingType屬性值設置為html而ScreenPixelsWidth 和ScreenPixelsHeight屬性取決於移動設備的具體型號因為Pocket PCSmartphone和Windows CE NET都可以使用Pocket Internet Explorer浏覽器但是這些設備屏幕的分辨率是不同的
因為不同移動設備使用的浏覽器是不同的因此相應的MobileCapabilities對象各個屬性也存在差異如果你要查看特定浏覽器的MobileCapabilities對象你可以在C:\WINDOWS\MicrosoftNET\Framework\[版本號]\CONFIG\Browsers目錄下查看openwavePocket Internet Explorerpalm和nokia等眾多浏覽器的信息下面是openwave浏覽器對應文件的一段代碼片斷在使用該浏覽器請求頁面時這些信息就會通過HTTP文件頭傳送到服務器端並構建具有類似屬性值的MobileCapabilities對象
<capabilities>
<capability name=browser value= />
<capability name=canInitiateVoiceCall value=true />
<capability name=canSendMail value=false />
<capability name=deviceID value=${deviceID} />
<capability name=deviceVersion value=${deviceVersion} />
<capability name=inputType value=telephoneKeypad />
<capability name=isMobileDevice value=true />
<capability name=majorVersion value=${browserMajorVersion} />
<capability name=maximumRenderedPageSize value= />
<capability name=minorVersion value=${browserMinorVersion} />
<capability name=numberOfSoftkeys value= />
<capability name=optimumPageWeight value= />
<capability name=preferredImageMime value=image/vndwapwbmp />
<capability name=preferredRenderingMime value=text/vndwapwml />
<capability name=preferredRenderingType value=wml />
<capability name=requiresAdaptiveErrorReporting value=true />
<capability name=rendersBreakBeforeWmlSelectAndInput value=true />
<capability name=rendersWmlDoAcceptsInline value=false />
<capability name=rendersWmlSelectsAsMenuCards value=true />
<capability name=requiresFullyQualifiedRedirectUrl value=true />
<capability name=requiresNoescapedPostUrl value=true />
<capability name=requiresPostRedirectionHandling value=true />
<capability name=supportsRedirectWithCookie value=false />
<capability name=type
value=${browserMajorVersion} />
<capability name=version
value=${browserMajorVersion}${browserMinorVersion} />
</capabilities>
當然你還可以通過代碼的方式將請求頁面的浏覽器信息通過MobileCapabilities對象顯示頁面上代碼如下
<%@ Page Inherits=SystemWebUIMobileControlsMobilePage
Language=c# %>
<script language=c# runat=server>
public void Page_Load(Object sender EventArgs e)
{
SystemWebMobileMobileCapabilities currentCapabilities;
MobileCapabilities currentCapabilities = (MobileCapabilities)RequestBrowser;
// 創建一個MobileCapabilities對象來獲取浏覽器的信息
if(currentCapabilitiesPreferredRenderingMIME==text/html)
{
LabelText = 你使用的是支持HTML的移動設備;
//如果是支持HTML的移動設備的話顯示上面的文本信息
}
else if(currentCapabilitiesPreferredRenderingMIME == text/vndwapwml)
{
LabelText = 你使用的是支持WML的移動設備;
//如果是支持WML的移動設備的話顯示上面的文本信息
}
LabelText = 屏幕的寬度(字符數): + currentCapabilitiesScreenCharactersWidth;
//顯示當前移動設備每一行可以顯示的字符數
}
</script>
<Mobile:Form runat=server id=frmTemplate >
<mobile:label ID=Label runat=server />
<mobile:label ID=Label runat=server />
</Mobile:Form>
提示在某些情況下某特定移動設備的MobileCapabilities對象獲得的屬性值並不是你期望的值例如我們經常在開發過程中直接使用桌面的IE來測試程序你也許會認為PreferredRenderingType屬性值為html而實際上這個值為html這是因為ASPNET移動控件只支持HTML 所以發送到桌面IE的標記語言依然是HTML
MobileCapabilities的屬性
MobileCapabilities類包含了大量的屬性我們可以使用這些屬性來獲取移動設備及其浏覽器 的相關信息關於該類的具體細節你可以查看MSDN在這裡我們只列舉出一些常用的屬性
屬性 說明
Browser 浏覽器的類型例如Pocket IEMicrosoft Mobile Explorer imodeNokiaOpenwave和Ericsson等
CanInitiateVoiceCall 當該設備的浏覽器可以啟動語音呼叫時返回true值
CanSendMail 如果該設備的浏覽器支持郵件的發送就返回true值
HasBackButton 如果該浏覽器有一個專用的上一步按鈕的話則返回true值
InputType 返回浏覽器支持的輸入類型包括virtualKeyboardtelephoneKeypad和keyboard等值
IsColor 該設備是否支持顏色顯示是的話返回true值
MaximumSoftkeyLabelLength 返回軟鍵標簽可顯示的文本的最大字符數
MobileDeviceManufacturer 返回移動設備制造商的名稱如果為未知的話返回的是unknown
MobileDeviceModel 獲取移動設備的型號名(如果已知)
NumberOfSoftkeys 返回移動設備上軟鍵的數目
PreferredImageMime 返回浏覽器通常首選的圖像內容類型的MIME類型這些值包括image/gifimage/jpegimage/vndwapwbmp和image/bmp
PreferredRenderingMime 返回浏覽器通常首選的內容類型的MIME類型這些值包括text/html和text/vndwapwml
PreferredRenderingType 返回一個指出該浏覽器使用的標記語言及版本信息的字符串這些字符串通常為htmlwmlwml或者chtml
ScreenBitDepth 返回屏幕的顯示深度(以每像素位數為單位)
ScreenCharactersHeight 返回顯示的近似高度(以字符行為單位)
ScreenCharactersWidth 返回顯示的近似寬度(以字符為單位)
ScreenPixelsHeight 返回顯示的近似高度(以像素為單位)
ScreenPixelsWidth 返回顯示的近似寬度(以像素為單位)
SupportsIModeSymbols 獲取一個值該值指示浏覽器是否支持imode符號
SupportsJPhoneSymbols 獲取一個值該值指示浏覽器是否支持JPhone特定的圖片符號
我們可以使用HttpRequest對象的Browser屬性指向MobileCapabilities對象的實例然後可以使用此實例來讀取請求浏覽器和設備的功能下面是測試MobileCapabilities對象的某個屬性的代碼片斷
MobileCapabilities capabilities = (MobileCapabilities)RequestBrowser;
if (capabilitiesScreenPixelsWidth > )
{
// 為大屏幕的移動設備添加的代碼
}
else
{
//為小屏幕的移動設備添加的代碼
}
在下一節中將介紹如何在移動站點程序中定義一個設備篩選器以及設備篩選器的兩種不同類型的具體實現
From:http://tw.wingwit.com/Article/program/net/201311/13820.html