一)准备
看资料说未公开的DLL提供访问照相机的闪光灯的API,利用其功能可以打开闪光灯使闪光灯一直保持打开状态,从而能实现手电筒的功能。商店里已经有很多类似的程序了,不知道微软怎么审核通过的。这个DLL就是Microsoft.Phone.Media.Extended.dll,该DLL文件的具体下载地址在后面的下载列表中。(该文件可以从模拟器的BIN文件中提取,这方面不懂,所以就直接拿来用了。)
1)Reference Assemblies
下载得到的文件是GAC_Microsoft.Phone.Media.Extended_v7_0_0_0_cneutral_1.dll,更名为Microsoft.Phone.Media.Extended.dll,然后复制拷贝到系统的程序集引用文件夹中,具体目录是:C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71。
2)强名称
使用VS的sn.exe工具,对DLL文件进行强名称验证,打开MSDOS命令行窗口或VS的命令行提示窗口,输入命令(复制粘贴即可)。注意运行命令行窗口时必须选择以“管理员身份运行”的模式(鼠标右键菜单中有)。
sn -Vr "C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\Microsoft.Phone.Media.Extended.dll"
3)自动引用
在目录C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\RedistList下面,有一个文件FrameworkList.xml,将DLL文件添加进去,即可实现在VS中添加引用是自动出现引用列表中。
打开这个XML文件,照猫画虎添加下面的内容即可。
<File AssemblyName="Microsoft.Phone.Media.Extended" Version="7.0.0.0" PublicKeyToken="24eec0d8c86cda1e" Culture="neutral" ProcessorArchitecture="MSIL" InGac="false" />
注意:添加引用时,VS会报告有风险,可以不理会。由于该DLL文件是属于系统全局缓存中的,手机的ROM中已经包含在内,所以不用将其加入工程,只是引用即可。
二)程序设计
1)应用按钮条ApplicationBar
在App.xaml中的Application.Resources标签中定义共用的应用按钮条的资源,然后每个页面进行绑定,以达到程序界面统一。注意:按钮的Text属性必须设置,不能留空或不定义。
资源定义:
<Application.Resources>
<shell:ApplicationBar x:Name="GlobalAppBar" IsVisible="True" IsMenuEnabled="True" Opacity="0">
<shell:ApplicationBarIconButton x:Name="btnLEDLightPage" IconUri="/Images/AppBarBtn_LEDLight_Light.png" Text="LED" Click="btnLEDLightPage_Click"/>
<shell:ApplicationBarIconButton x:Name="btnScreenLightPage" IconUri="/Images/AppBarBtn_ScreenLight_Light.png" Text="Screen" Click="btnScreenLightPage_Click"/>
<shell:ApplicationBarIconButton x:Name="btnSwitch" IconUri="/Images/AppBarBtn_Switch_Off_Light.png" Text="ON"/>
<shell:ApplicationBarIconButton x:Name="btnHelp" IconUri="/Images/AppBarBtn_Help_Light.png" Text="Help"/>
</shell:ApplicationBar>
</Application.Resources>
绑定:在页面的根标签PhoneApplicationPage中添加 ApplicationBar="{StaticResource GlobalAppBar}" 即可。
闪光灯按钮:从屏幕页面切换到闪光灯页面。
屏幕按钮:从闪光灯页面切换到屏幕页面。
开关按钮:开关。
帮助按钮:显示帮助。
事件定义:闪光灯按钮、屏幕按钮的操作是固定的,所以可以在App.xaml.cs中编写代码统一定义,开关按钮、帮助按钮则分别在不同的页面中定义。
事件加载:因为按钮是共用的,所以每个页面在载入、载出时要对开关按钮、帮助按钮的事件分别进行加载和卸载操作,也就是说在各自页面的OnNavigatedTo事件中加载按钮事件,而在OnNavigatedFrom事件中卸载按钮事件。
按钮图片:根据系统的主题色(深色或浅色),自动设置相应的图片给按钮使用,需要在各自的页面中进行设置。
2)闪光灯页面(主页面)
a)VideoCamera对象
添加的Microsoft.Phone的引用,在页面加载时对VideoCamera对象进行初始化,卸载页面时则及时释放。在VideoCamera的Initialized事件中设置LampEnabled=true,以便能使用闪光灯,该事件中如果要访问主页面UI的控件,则必须线程同步。同时,需要一个CameraVisualizer对象来配合VideoCamera作为其视频输出,否则VideoCamera不能正常工作,在主线程中创建CameraVisualizer并最后调用其SetCource方法将VideoCamera对象传入即可。
b)屏幕背景
闪光灯打开时,显示手电筒照亮的图片,闪光灯关闭时,则显示手电筒熄灭的图片。同时,轻拍手电的灯泡时也能打开或关闭闪光灯,与开关按钮保持同步。屏幕背景的显示是将相应图片填入Grid的Background属性,这样一来,页面实际就是一个空的Grid。
c)页面状态
利用PhoneApplicationService.Current.State来保存状态,在OnNavigatedTo事件中取出状态,在OnNavigatedFrom事件中保存状态。
d)拦截回退
程序的主页面中覆写OnBackKeyPress事件,以便能够提示用户确认退出,通过设置事件参数CancelEventArgs的Cancel=true即可。
e)灯泡Tap
在Grid中恰当位置,放置一个没有边界、没有内容、透明的Button来处理,如:BorderBrush="{x:Null}" BorderThickness="0" Opacity="0"
注意:
*主页面默认的名称是MainPage,最好不要试图修改这个名称,以免产生一些莫名其妙的麻烦。
*开发调试时,不要随意修改WMAppManifest.xml文件中的Capabilities标签中的内容,以免在编译调试时出现dll产生异常之类的错误。正式发布时,再根据实际情况去除不必要的设备需求项目(Capability标签)。
*不要修改SplashScreenImage.jpg文件,即不要修改文件的名称、后缀、位置、Build Action(必须为Content),除非你自己来实现程序启动时所显示的闪现界面(或者不要)。
3)屏幕页面
a)屏幕背景色
闪光灯打开时,屏幕背景色设置显示为白色;闪光灯关闭时,则是黑色。页面实际是一个空的Grid,直接设置Grid的Background为白色或黑色。
b)页面状态
利用PhoneApplicationService.Current.State来保存状态,在OnNavigatedTo事件中取出状态,在OnNavigatedFrom事件中保存状态。
4)帮助界面
1)使用Border
Border的好处就是,它是带有一个Visibility属性的容器,且不受Grid、StackPanel的布局限制。
暂时没有找到更好的办法,只好在每个页面中放置相同内容的一个Border。Border的Content内容就是标题、关闭按钮、帮助内容、作者、时间等信息。
2)关闭Tap
应用按钮条ApplicationBar上的帮助按钮打开显示帮助界面Border,轻拍Border上的关闭按钮则隐藏帮助界面Border。
三)国际化与本地化
1)语言类型
默认语言类型:在工程的Assesmly Information属性窗口中的Neutral Language下拉列表中设置。
支持语言类型:VS中关闭工程,打开工程文件MiniFlashLight.csproj,编辑SupportedCultures标签中的内容,一种语言类型添加一个代码,不同代码之间使用英文分号隔开。如:<SupportedCultures>zh-CN</SupportedCultures>
2)AppResources.resx与AppResources.zh-CN.resx
作用:应用程序中相关的界面显示所需要的信息根据系统设置的显示语言来自动调整,程序中只需要进行绑定或少量编码即可。
添加一个程序默认语言类型的资源文件(本程序为美国英文),命名为AppResources.resx,编辑其中的字符串内容,同时需要将资源文件的Access Modifier属性修改为Public。
添加新的支持语言类型的资源文件(本程序为简体中文),操作相同,命名格式为AppResource.XXXX.resx,XXXX编码可以参考微软MSDN。
3)AppResLib.dll与AppResLib.dll.0804.mui
作用:应用程序的名称能够自动本地化,即程序在系统的程序列表中的名称和待机屏幕上Tile的显示名称能够根据系统设置的显示语言来自动调整。
AppResLib.dll:程序默认的语言类型的资源文件。
创建一个空的VC++的Win32的DLL工程,同时设置工程属性中的No Entry Point为YES(NOENTRY),设置的操作路径为Properties->Configuration Properties->Linker->Advanced->No Entry Point,添加字符串类型的资源文件,编辑字符串:
ID Value Caption
---------------------------------------------------------
AppTitle 100 MiniFlashlight
AppTileString 200 MiniFlashlight
编译工程,生成AppResLib.dll文件,将DLL文件引用添加到工程中。
AppResLib.dll.0804.mui:程序支持的具体某个语言类型的资源文件,0804表示简体中文,具体编码可以参考微软MSDN。
创建一个空的VC++的Win32的DLL工程,同时设置工程属性中的No Entry Point为YES(NOENTRY)(Properties->Configuration Properties->Linker->Advanced->No Entry Point项目),添加字符串类型的资源文件,编辑字符串:
ID Value Caption
---------------------------------------------------------
AppTitle 100 迷你手电筒
AppTileString 200 迷你手电筒
编译工程,生成新的AppResLib.dll文件,将文件改名为AppResLib.dll.0804.mui,并将文件引用添加到工程中。
最后,在工程的属性对话框Application页面中,设置为分发选项的Title为“@AppResLib.dll,-100”,Tile选项的Title为“@AppResLib.dll,-200”。
整个解决方案的工程列表:
四)其他
1)下载列表
Microsoft.Phone.Media.Extended.dll(完整的DLL文件包)
2)参考链接
未公开的摄像头VideoCamera介绍
http://wei.si/blog/2011/03/access-to-native-camera-apis-on-windows-phone-7/
http://dotnet.dzone.com/articles/not-your-regular-photo-and
MSDN帮助(国际化与本地化)
http://msdn.microsoft.com/en-us/library/ff637522(v=VS.92).aspx
五)思考
1)程序代码或XAML文件中不能使用AppResLib.dll的程序名称的值,只好在AppResources.resx中也定义一个程序名称来使用了。