WindowsPhone 7 的外设 这里只介绍Windows Phone的收音机和震动功能。(参照传智博客的视频而写) Windows phone 7的收音机功能的实现 实现收音机功能首先需要引用这个名字空间:using Microsoft.Devices.Radio;在实现收音机的功能之前,我们需要知道FMRadio是一个单例类,即它只有一个实例,因此它也为单例模式。我们不能再声明它的一个实例。 注:单例模式:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式的唯一实例是Instance.它有以下属性: FMRadio 还有两个枚举: | | | 表示收音机所在地区,有三个枚举值: Europe, Japan和 UnitedStates. |
下面我们来看看如何通过代码实现收音机的功能。 首先我们设置一个FMRadio的变量它就等于Instance实例 FMRadio myradio= FMRadio.Instance; 接着设置该变量(即FMRadio的实例)的电源模式为开(即打开收音机): myradio.PowerMode = RadioPowerMode.On; //设置电源模式为开 之后还可以设置收音机的地区频率等: myradio.CurrentRegion = RadioRegion.UnitedStates; //设置收音机所在地为US myradio.Frequency = 100; //设置收音机的频率为100 设置完成以后以上便实现了一个收音机的基本功能。 Windowsphone 7的振动实现 实现振动效果需要引用该命名空间 using Microsoft.Phone.Devices; 实现振动只需要一句话: VibrateController.Default.Start(TimeSpan.FromSeconds(2)); 这行代码表示振动以秒计(FromSeconds),振动两秒。同理还有FromDays, FromHours, FromMinutes等。 二.实现Windows Phone 7的重力感应 首先需要引用这个 Using Microsoft.Devices.Sensors; 接着我们实例化一个对象: Accelerometer acc = new Accelerometer(); 然后注册检测加速度变化的事件ReadingChanged: acc.ReadingChanged+= new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChanged);//注册事件 acc.Start();//启动重力加速 上面代码的解释:当加速度发生改变时,便会出发ReadingChanged事件,但是由于调用事件的处理函数和当前运行的页面处于不同的线程(重力感应的事件处理函数在后台运行的),因此需要通过使用位于System.Windows.Deployment命名空间下的Dispatcher类,来调用位于当前页面线程的方法。具体代码如下: void acc_ReadingChanged(object sender, AccelerometerReadingEventArgse) { this.Dispatcher.BeginInvoke(new accdelegete(ACCchanged),e); } 声明一个委托 public delegate void accdelegete (AccelerometerReadingEventArgs e); 声明一个委托的代理方法: void ACCchanged(AccelerometerReadingEventArgs e) { //此处添加当加速度改变时要执行的代码(也就是想实现的功能) XtextBox.Text = e.X.ToString();//将x轴方向的重力感应数据赋给TextBox YtextBox.Text = e.Y.ToString();//将y轴方向的重力感应数据赋给TextBox ZtextBox.Text = e.Z.ToString();//将z轴方向的重力感应数据赋给TextBox } 这样便是实现了重力加速感应的应用。 注:关于BeginInvoke方法的解说(摘自MSDN) 《-----在 WPF 中,只有创建 DispatcherObject 的线程才能访问该对象。 例如,一个从主 UI 线程派生的后台线程不能更新在该 UI 线程上创建的 Button 的内容。 为了使该后台线程能够访问 Button 的 Content 属性,该后台线程必须将此工作委托给与该 UI 线程关联的 Dispatcher。 使用 Invoke 或 BeginInvoke 来完成此操作。 Invoke 是同步操作,而 BeginInvoke 是异步操作。 该操作将按指定的 DispatcherPriority 添加到 Dispatcher 的事件队列中。 BeginInvoke 是异步操作;因此,调用之后控制权会立即返回给调用对象。 BeginInvoke 返回一个 DispatcherOperation 对象,当委托位于事件队列中时,该对象可用于与委托进行交互。 由 BeginInvoke 返回的 DispatcherOperation 对象可以采用多种方式与指定的委托进行交互,例如: 当在事件队列中挂起执行时,更改委托的 DispatcherPriority。 从事件队列中移除委托。 等待委托返回。 获取委托执行之后返回的值。 如果按同一个 DispatcherPriority 调用多个 BeginInvoke,将按调用发生的顺序执行它们。 如果对某个已关闭的 Dispatcher 调用 BeginInvoke,则返回的 DispatcherOperation 的状态属性将设置为 Aborted----》 所以根据以上的解说我们便对: this.Dispatcher.BeginInvoke(newaccdelegete(ACCchanged), e); 这一行代码不陌生了。 由于我们要操作位于当前运行页面上的TextBox空间,所以后台的线程不能直接访问该TextBox的Text。因此必须交与和TextBox相关的线程即当前页面所处的线程来完成,所以我们选择BeginInvoke方法来完成该任务。 以上步骤微软在推出.NET3.5后还有新的写法,推荐这样使用。上面的代码可以这样写: void acc_ReadingChanged(object sender, AccelerometerReadingEventArgse) { Deployment.Current.Dispatcher.BeginInvoke(()=> ACCchanged(e)); } void ACCchanged(AccelerometerReadingEventArgse) { XtextBox.Text= e.X.ToString(); YtextBox.Text= e.Y.ToString(); ZtextBox.Text= e.Z.ToString(); } 以上代码和之前使用委托的方法是一样的效果。 =>这个符号,本人不是很明白,求解! |