关闭

Windows Phone 7 自定义事件

标签: windows phonecallbackbuttonstring网络class
190人阅读 评论(0) 收藏 举报

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

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

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

2、定义一个委托;

3、定义一个事件

4、添加事件。

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

自定义的事件参数类

StateChangedEventArgs.cs

using System;

namespace EventDemo
{
    /// <summary>
    /// 状态事件
    /// </summary>
    public class StateChangedEventArgs : EventArgs
    {
        public readonly string NewState;
        public readonly DateTime Timestamp;

        public StateChangedEventArgs(string newstate)
        {
            this.NewState = newstate;
            this.Timestamp = DateTime.Now;
        }
    }
}

在业务类里面定义事件:

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;
        //出事状态
        public string NetTaskName = "";

        /// <summary>
        /// 网络任务
        /// </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);

                //等待线程结束
                webRequestWait.WaitOne();
                if (success)
                {
                    break;
                }
                attempt++;
                Thread.Sleep(1000);
            }
            if (success)
            {
                OnStateChanged(this, new StateChangedEventArgs("成功"));
                Thread.Sleep(50);
            }
            else
            {
                OnStateChanged(this, new StateChangedEventArgs("失败"));
            }
        }
    }
}


简单的测试一下

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Button Content="测试网络" 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="网络的状态:" 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 = "测试网络";
            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();
        }
    }
}

 运行的效果如下:

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22057次
    • 积分:418
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:27篇
    • 译文:0篇
    • 评论:3条
    最新评论