WP7开发中自定义事件的处理

在Windows Phone的应用开发里面,对于事件这种东西我们可以随处可见,系统本来就已经封装好了各种各样的事件机制,如按钮的单击事件等等的。在实际的开发中,我们需要自己去给相关的类自定义一些事件来满足业务的要求,特别在使用观察着模式的时候,在WP7中利用事件去实现是理所当然的。

自定义事件步骤有下面的几个步骤:

1、继承EventArgs类实现自己自定义的事件参数;

2、定义一个委托;

3、定义一个事件;

4、添加事件。

下面来看一下一个Demo对自定义事件的实现,这个Demo只是对网络请求的状态进行一个简单的事件监控的调用处理:

自定义的事件参数类

StateChangedEventArgs.cs

  1. using System;
  2. namespace EventDemo
  3. {
  4. /// <summary>
  5. /// 状态事件
  6. /// </summary>
  7. public class StateChangedEventArgs : EventArgs
  8. {
  9. public readonly string NewState;
  10. public readonly DateTime Timestamp;
  11. public StateChangedEventArgs(string newstate)
  12. {
  13. this.NewState = newstate;
  14. this.Timestamp = DateTime.Now;
  15. }
  16. }
  17. }

在业务类里面定义事件

NetTask.cs

  1. using System;
  2. using System.Net;
  3. using System.Threading;
  4. using System.IO;
  5. namespace EventDemo
  6. {
  7. public class NetTask
  8. {
  9. //定义委托
  10. public delegate void StateChanged(NetTask sender, StateChangedEventArgs args);
  11. //定义事件
  12. public event StateChanged OnStateChanged;
  13. //出事状态
  14. public string NetTaskName = "";
  15. /// <summary>
  16. /// 网络任务
  17. /// </summary>
  18. /// <paramname="url"></param>
  19. public void StartNetTask(string url)
  20. {
  21. bool success = false;
  22. int attempt = 0;
  23. while (attempt <3)
  24. {
  25. AsyncCallback callback = null;
  26. //开启线程等待
  27. ManualResetEvent webRequestWait = new ManualResetEvent(false);
  28. Uri targetUri = new Uri(url);
  29. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUri);
  30. request.Method = "POST";
  31. if (callback == null)
  32. {
  33. callback = delegate(IAsyncResult asRequest)
  34. {
  35. try
  36. {
  37. success = true;
  38. webRequestWait.Set();
  39. //……
  40. }
  41. catch
  42. {
  43. OnStateChanged(this, new StateChangedEventArgs("重试"));
  44. webRequestWait.Set();
  45. }
  46. };
  47. }
  48. request.BeginGetRequestStream(callback, request);
  49. //等待线程结束
  50. webRequestWait.WaitOne();
  51. if (success)
  52. {
  53. break;
  54. }
  55. attempt++;
  56. Thread.Sleep(1000);
  57. }
  58. if (success)
  59. {
  60. OnStateChanged(this, new StateChangedEventArgs("成功"));
  61. Thread.Sleep(50);
  62. }
  63. else
  64. {
  65. OnStateChanged(this, new StateChangedEventArgs("失败"));
  66. }
  67. }
  68. }
  69. }

简单的测试一下:

  1. <Gridx:Name="ContentPanel"Grid.Row="1"Margin="12,0,12,0">
  2. <ButtonContent="测试网络"Height="72"HorizontalAlignment="Left"Margin="143,105,0,0"Name="button1"VerticalAlignment="Top"Width="202"Click="button1_Click"/>
  3. <TextBlockHeight="50"HorizontalAlignment="Left"Margin="96,270,0,0"Name="textBlock1"Text="网络的状态:"VerticalAlignment="Top"Width="126"/>
  4. <TextBlockHeight="48"HorizontalAlignment="Left"Margin="34,326,0,0"Name="textBlock2"Text=""VerticalAlignment="Top"Width="377"/>
  5. </Grid>

MainPage.xaml.cs

  1. using System.Windows;
  2. using Microsoft.Phone.Controls;
  3. namespace EventDemo
  4. {
  5. public partial class MainPage : PhoneApplicationPage
  6. {
  7. public MainPage()
  8. {
  9. InitializeComponent();
  10. }
  11. privatevoid button1_Click(object sender, RoutedEventArgs e)
  12. {
  13. NetTask netTask = new NetTask();
  14. netTask.OnStateChanged += OnStateChanged;
  15. netTask.NetTaskName = "测试网络";
  16. netTask.StartNetTask("http://www.cnblogs.com");
  17. }
  18. publicvoid OnStateChanged(object sender, StateChangedEventArgs e)
  19. {
  20. NetTask temp = sender as NetTask;
  21. textBlock2.Text = temp.NetTaskName + "," + e.NewState+","+e.Timestamp.ToLongTimeString();
  22. }
  23. }
  24. }

运行的效果如下:

原文地址:https://www.cnblogs.com/xzty/p/2520332.html