Device Adapter概念
按照MSDN《
Walkthrough: Adding Support for Devices》的指示:
我们要想自定义MMIT(Microsoft Mobile Internet Toolkit)提供的控件,那么可以改变Adapter在最后关头的渲染工作。
首先,我们要说明render的概念,最好的动画教程就是
http://www.asp.net/mobile/2514A_01A001.swf,它是Mobile Web Application Architecture的flash讲解。
所有的
ASP.NET mobile device adapter都是通过text writer做render的。这些text writer均继承自
MobileTextWriter
。它提供了
Write, WriteLine,
以及
WriteBeginTag
等方法。对于WML来说,这个Text Writer是System.Web.UI.MobileControls.Adapters.WmlMobileTextWriter。
第一步,下载
http://go.microsoft.com/fwlink/?LinkId=6350的Device Adapter Code源代码;
或者直接链接
MobileIT.exe
|
第二步,编辑其中的
WmlTextBoxAdapter.cs
文件;
第三步,通过
csc.exe
生成出一个新的
Adapter DLL
;
第四步,配置
web.config
;
第五步,重新编译你的工程。
可惜呀,
MobileIt.exe
下载不了。当然在
ASP.NET 2.0
中,是很容易地自定义
Adapter
的。
那么现在
ASP.NET 1.1
中,我们只好折衷采用下面的办法:
自定义一个Adapter类
在这里我们来定义一个继承自
System.Web.UI.MobileControls.Adapters.WmlListAdapter
的Adapter,来准备改写mobile:list控件的输出方式。
将下面的代码保存为ListAdapter.cs:
ListAdapter.cs
|
using
System;
using
System.Collections;
using
System.Web.UI.MobileControls.Adapters;
namespace
iUltraMobiles
{
///<summary>
/// ListAdapter
的摘要说明。
///
首先利用下面的命令编译出一个ListAdapter.dll:
/// csc /t:library /r:System.Web.Mobile.dll ListAdapter.cs
///
其次,将以下的配置添加入web.config中mobileControls节点下:
///<device name="UltraListDeviceAdapters"
/// inheritsFrom="WmlListAdapter">
///<control name="System.Web.UI.MobileControls.Form"
/// adapter="iUltraMobiles.ListAdapter, iUltraMobiles" />
///</device>
/// <see cref="http://www.cnblogs.com/zhengyun_ustc/archive/2005/07/28/customcuildyourmobilecontrol.html"/>
/// <seealso cref="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mwsdk/html/mwlrfdevice.asp"/>
///</summary>
public class ListAdapter :System.Web.UI.MobileControls.Adapters.WmlListAdapter
{
public override void Render(
System.Web.UI.MobileControls.Adapters.WmlMobileTextWriter writer)
{
// Add your attributes here.
writer.WriteBeginTag("img");
writer.WriteAttribute("src","Images/1.png");
writer.WriteAttribute("alt", "
欢迎您!");
writer.WriteLine(" />");
base.RenderChildren(writer);
}
}
}
|
编译ListAdapter
利用下面的命令编译出一个ListAdapter.dll:
csc /t:library /r:System.Web.Mobile.dll ListAdapter.cs
将这个
ListAdapter.DLL
复制到你的
WAP
应用程序
bin
目录下。
修改web.config来提供control mapping
在你的web.config文件中找到mobileControls节点,修改为以下:
Web.config
中的
system.web
节点下
|
<!
--
指定没有 COOKIE 的数据字典类型
这将使字典的内容出现在本地请求 URL 查询字符串中。
这是在没有 Cookie 的设备上进行窗体身份验证所必需的。
--
>
<!--
在您使用像 useRandomID 这样的自定义属性时,必须在您的移动 Web 应用程序中启用自定义属性allowCustomAttributes。
--
>
<mobileControlsallowCustomAttributes="true"cookielessDataDictionaryType="System.Web.Mobile.CookielessData">
<devicename="UltraListDeviceAdapters"
inheritsFrom
="WmlDeviceAdapters">
<controlname="System.Web.UI.MobileControls.List"
adapter
="iUltraMobiles.ListAdapter, iUltraMobiles"
/>
</device>
</mobileControls>
|
device
节点就声明了一个新的
Adapter
,名为“
UltraListDeviceAdapters
”,这个名字是可以随便定义的。
inheritsFrom
属性是指。你必须提供控件的
fully qualified control class name
:“
iUltraMobiles.ListAdapter, iUltraMobiles
”,
control
的
name
属性指的是“
你重载的哪一个mobile控件
”
。
试用新控件
现在你已经修改了mobile:list控件的最终渲染方式,在它原本输出的诸多个<a> tag之前抢先输出了你的image的符合wml规范的tag。
这样,你的aspx页面不需要做任何改动,重新编译你的工程后,新的渲染方式就生效了。
你可以在M3gate模拟器上试验。
附录A mobileControls例子:
下面给一个比较完整的例子做示范:
<!-- Adapter configuration for mobile controls used in the portal -->
<
mobileControls
>
<
device
name="PortalHtmlDeviceAdapters" inheritsFrom="HtmlDeviceAdapters"
>
<
control
name="ASPNetPortal.MobileControls.TabbedPanel, Portal" adapter="ASPNetPortal.MobileControls.HtmlTabbedPanelAdapter,Portal"
/>
<
control
name="ASPNetPortal.MobileControls.LinkCommand, Portal" adapter="ASPNetPortal.MobileControls.HtmlLinkCommandAdapter,Portal"
/>
</
device
>
<
device
name="PortalChtmlDeviceAdapters" inheritsFrom="ChtmlDeviceAdapters"
>
<
control
name="ASPNetPortal.MobileControls.TabbedPanel, Portal" adapter="ASPNetPortal.MobileControls.ChtmlTabbedPanelAdapter,Portal"
/>
</
device
>
<
device
name="PortalWmlDeviceAdapters" inheritsFrom="WmlDeviceAdapters"
>
<
control
name="ASPNetPortal.MobileControls.TabbedPanel, Portal" adapter="ASPNetPortal.MobileControls.WmlTabbedPanelAdapter,Portal"
/>
</
device
>
</
mobileControls
>
|
附录
B mobileControls
属性定义表:
mobileControls
节点的具体各项属性定义可以参见:
The <mobileControls> element has the attributes shown in the following table.
Attributes of the <device> subtag
|
Description
|
name
|
Specifies the unique name by which you must identify the device adapter set.
|
inheritsFrom
|
An optional reference to another device adapter set, from which this set must inherit. The specified device adapter set can either appear earlier in the same <mobileControls> section, or in the <mobileControls> section of a higher-level configuration file.
|
predicateClass
|
Specifies the class type that supplies the evaluator predicate. The name that you use for the class type must follow the .NET Framework standards for specifying a fully qualified type name.
ASP.NET searches the specified assembly for the type. If the adapter set inherits from another type, the predicateClass attribute is not necessary and will default to the parent set's value.
|
predicateMethod
|
Specifies the method that supplies the evaluator predicate. The method must be static, and of the following signature:
static bool EvaluatorMethod(HttpContext context)
If the adapter set inherits from another adapter set, the predicateMethod attribute is not necessary, and will default to the parent set's value.
|
pageAdapter
|
Specifies the class type of the page adapter for the adapter set. The specified class must implement the IPageAdapter interface. The name must follow the .NET standards for specifying a fully qualified type name.
ASP.NET searches the specified assembly for the type. If the adapter set inherits from another adapter set, the pageAdapter attribute is not necessary, and will default to the parent set's value.
|
附录C 实例代码:
'*********************************************************************
'
' HtmlTabbedPanelAdapter.Render Method
'
' Renders the control. The TabbedPanel is rendered as one or more
' rows of tabs that the user can click on to move between tabs.
'
'*********************************************************************
Public Overloads Overrides Sub Render(ByVal writer As HtmlMobileTextWriter)
Dim _activePane As IPanelPane = Control.ActivePane
Dim tabsPerRow As Integer = Control.TabsPerRow
Dim panes As PanelPaneCollection = Control.Panes
Dim paneCount As Integer = panes.Count
' Figure out the number of visible panes.
Dim visiblePanes(paneCount) As Integer
Dim visiblePaneCount As Integer = 0
Dim i As Integer
For i = 0 To paneCount - 1
If CType(panes(i), Control).Visible Then
visiblePanes(visiblePaneCount) = i
visiblePaneCount += 1
End If
Next i
' Calculate how many rows are necessary.
Dim rows As Integer = (visiblePaneCount + tabsPerRow - 1) / tabsPerRow
' make sure tabsPerRow doesn't exceed the number of visible panes
If Control.TabsPerRow > visiblePaneCount Then
tabsPerRow = visiblePaneCount
Else
tabsPerRow = Control.TabsPerRow
End If
' Open the table.
writer.WriteBeginTag("table")
writer.WriteAttribute("cellspacing", "0")
writer.WriteAttribute("cellpadding", "2")
writer.WriteAttribute("border", "0")
writer.WriteLine(">")
Dim row As Integer
For row = rows - 1 To 0 Step -1
writer.WriteFullBeginTag("tr")
writer.WriteLine()
Dim col As Integer
For col = 0 To tabsPerRow - 1
writer.WriteBeginTag("td")
writer.WriteAttribute("width", "0")
writer.Write(">")
writer.WriteEndTag("td")
i = row * tabsPerRow + col
If row > 0 And i >= visiblePaneCount Then
writer.WriteFullBeginTag("td")
writer.WriteEndTag("td")
Goto ContinueNextCol
End If
Dim index As Integer = visiblePanes(i)
Dim child As IPanelPane = panes(index)
If child Is _activePane Then
writer.WriteBeginTag("td")
writer.WriteAttribute("bgcolor", GetColorString(Control.ActiveTabColor, "#333333"))
writer.Write(">")
writer.WriteBeginTag("font")
writer.WriteAttribute("face", "Verdana")
writer.WriteAttribute("size", "-2")
writer.WriteAttribute("color", GetColorString(Control.ActiveTabTextColor, "#000000"))
writer.Write(">")
writer.WriteFullBeginTag("b")
writer.Write(" ")
writer.WriteText(child.Title, True)
writer.Write(" ")
writer.WriteEndTag("b")
writer.WriteEndTag("font")
writer.WriteEndTag("td")
writer.WriteLine()
Else
writer.WriteBeginTag("td")
writer.WriteAttribute("bgcolor", GetColorString(Control.TabColor, "#cccccc"))
writer.Write(">")
writer.WriteBeginTag("font")
writer.WriteAttribute("face", "Verdana")
writer.WriteAttribute("size", "-2")
writer.WriteAttribute("color", GetColorString(Control.TabTextColor, "#000000"))
writer.Write(">")
writer.Write(" ")
writer.WriteBeginTag("a")
RenderPostBackEventAsAttribute(writer, "href", index.ToString())
writer.Write(">")
writer.WriteText(child.Title, True)
writer.WriteEndTag("a")
writer.Write(" ")
writer.WriteEndTag("font")
writer.WriteEndTag("td")
writer.WriteLine()
End If
ContinueNextCol:
Next col
writer.WriteEndTag("tr")
writer.WriteLine()
If row > 0 Then
writer.WriteFullBeginTag("tr")
writer.WriteBeginTag("td")
writer.WriteAttribute("height", "1")
writer.Write(">")
writer.WriteEndTag("td")
writer.WriteEndTag("tr")
writer.WriteLine()
End If
Next row
writer.WriteEndTag("table")
writer.WriteLine()
writer.WriteBeginTag("table")
writer.WriteAttribute("width", "100%")
writer.WriteAttribute("height", "2")
writer.WriteAttribute("border", "0")
writer.WriteAttribute("cellspacing", "0")
writer.WriteAttribute("bgcolor", "#000000")
writer.Write(">")
writer.WriteFullBeginTag("tr")
writer.WriteFullBeginTag("td")
writer.WriteEndTag("td")
writer.WriteEndTag("tr")
writer.WriteEndTag("table")
writer.WriteBreak()
CType(_activePane, Control).RenderControl(writer)
End Sub