WP7開發(fā)中自定義事件的處理
在Windows Phone的應(yīng)用開發(fā)里面,對(duì)于事件這種東西我們可以隨處可見,系統(tǒng)本來就已經(jīng)封裝好了各種各樣的事件機(jī)制,如按鈕的單擊事件等等的。在實(shí)際的開發(fā)中,我們需要自己去給相關(guān)的類自定義一些事件來滿足業(yè)務(wù)的要求,特別在使用觀察著模式的時(shí)候,在WP7中利用事件去實(shí)現(xiàn)是理所當(dāng)然的。
自定義事件步驟有下面的幾個(gè)步驟:
1、繼承EventArgs類實(shí)現(xiàn)自己自定義的事件參數(shù);
2、定義一個(gè)委托;
3、定義一個(gè)事件;
4、添加事件。
下面來看一下一個(gè)Demo對(duì)自定義事件的實(shí)現(xiàn),這個(gè)Demo只是對(duì)網(wǎng)絡(luò)請(qǐng)求的狀態(tài)進(jìn)行一個(gè)簡單的事件監(jiān)控的調(diào)用處理:
自定義的事件參數(shù)類
StateChangedEventArgs.cs
- using System;
- namespace EventDemo
- {
- /// <summary>
- /// 狀態(tài)事件
- /// </summary>
- public class StateChangedEventArgs : EventArgs
- {
- public readonly string NewState;
- public readonly DateTime Timestamp;
- public StateChangedEventArgs(string newstate)
- {
- this.NewState = newstate;
- this.Timestamp = DateTime.Now;
- }
- }
- }
在業(yè)務(wù)類里面定義事件
NetTask.cs
- using System;
- using System.Net;
- using System.Threading;
- using System.IO;
- namespace EventDemo
- {
- public class NetTask
- {
- //定義委托
- public delegate void StateChanged(NetTask sender, StateChangedEventArgs args);
- //定義事件
- public event StateChanged OnStateChanged;
- //出事狀態(tài)
- public string NetTaskName = "";
- /// <summary>
- /// 網(wǎng)絡(luò)任務(wù)
- /// </summary>
- /// <param name="url"></param>
- public void StartNetTask(string url)
- {
- bool success = false;
- int attempt = 0;
- while (attempt < 3)
- {
- AsyncCallback callback = null;
- //開啟線程等待
- ManualResetEvent webRequestWait = new ManualResetEvent(false);
- Uri targetUri = new Uri(url);
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUri);
- request.Method = "POST";
- if (callback == null)
- {
- callback = delegate(IAsyncResult asRequest)
- {
- try
- {
- success = true;
- webRequestWait.Set();
- //……
- }
- catch
- {
- OnStateChanged(this, new StateChangedEventArgs("重試"));
- webRequestWait.Set();
- }
- };
- }
- request.BeginGetRequestStream(callback, request);
- //等待線程結(jié)束
- webRequestWait.WaitOne();
- if (success)
- {
- break;
- }
- attempt++;
- Thread.Sleep(1000);
- }
- if (success)
- {
- OnStateChanged(this, new StateChangedEventArgs("成功"));
- Thread.Sleep(50);
- }
- else
- {
- OnStateChanged(this, new StateChangedEventArgs("失敗"));
- }
- }
- }
- }
簡單的測(cè)試一下:
- <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
- <Button Content="測(cè)試網(wǎng)絡(luò)" Height="72" HorizontalAlignment="Left" Margin="143,105,0,0" Name="button1" VerticalAlignment="Top" Width="202" Click="button1_Click" />
- <TextBlock Height="50" HorizontalAlignment="Left" Margin="96,270,0,0" Name="textBlock1" Text="網(wǎng)絡(luò)的狀態(tài):" VerticalAlignment="Top" Width="126" />
- <TextBlock Height="48" HorizontalAlignment="Left" Margin="34,326,0,0" Name="textBlock2" Text="" VerticalAlignment="Top" Width="377" />
- </Grid>
MainPage.xaml.cs
- using System.Windows;
- using Microsoft.Phone.Controls;
- namespace EventDemo
- {
- public partial class MainPage : PhoneApplicationPage
- {
- public MainPage()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, RoutedEventArgs e)
- {
- NetTask netTask = new NetTask();
- netTask.OnStateChanged += OnStateChanged;
- netTask.NetTaskName = "測(cè)試網(wǎng)絡(luò)";
- netTask.StartNetTask("http://www.cnblogs.com");
- }
- public void OnStateChanged(object sender, StateChangedEventArgs e)
- {
- NetTask temp = sender as NetTask;
- textBlock2.Text = temp.NetTaskName + "," + e.NewState+","+e.Timestamp.ToLongTimeString();
- }
- }
- }
運(yùn)行的效果如下:
原文鏈接:http://www.cnblogs.com/linzheng/archive/2012/03/26/2418811.html