Windows Phone 7 自定义事件

转载 2012年03月30日 21:06:24

 在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();
        }
    }
}

 运行的效果如下:

注册成为Windows Phone开发者并且解锁Windows Phone 8.1手机

上篇文章介绍了如何使用Qt Creator和Visual Studio构建Windows Phone 8.1应用并且在Windows Phone 8.1模拟器上运行。当然了,能够运行在模拟器只能算第一...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2014年08月28日 13:02
  • 3699

Windows Phone 保存、读取图片

转自:http://blog.csdn.net/leons77/article/details/8085662 读取图片 图片的来源一般有3个地方:网络、独立存储和程序包。 ...
  • gf771115
  • gf771115
  • 2014年07月09日 23:31
  • 2134

Windows Phone开发(二)-- 框架结构和启动过程

上一篇文章介绍了Windows Phone的开发环境和一个简单的Windows Phone程序的演示和结构,这一篇文章要深入一点,介绍Windows Phone的框架结构和程序启动的过程。 一 Win...
  • cc_net
  • cc_net
  • 2011年06月21日 02:18
  • 6860

Windows Phone 学生开发者账号免费注册攻略

1. 打开Windows开发者
  • sunhao2011
  • sunhao2011
  • 2014年08月06日 10:27
  • 1449

Windows 8.1 下 Windows Phone 开发环境的搭建流程

转载:Windows 8.1 下 Windows Phone 开发环境的搭建流程 Windows 8.1 下 Windows Phone 开发环境的搭建流程...
  • LH806732
  • LH806732
  • 2014年04月14日 19:24
  • 3802

windows phone 7环境安装

由于用的还是XP的操作系统,发现SDK要求win7或者vista的系统,找了度娘,更改了 baseline.dat中的7788那一节点的InstallOnLHS和InstallOnWinXP为0就可以...
  • zhangjiesoft
  • zhangjiesoft
  • 2011年08月18日 14:09
  • 157

Windows Phone 8开发环境搭建

开发Windows Phone需要两个工具:Windows Phone SDK 8.0和Visual Studio集成开发工具。我们购买的Visual Studio Ultimate 2012不包括W...
  • tonny_guan
  • tonny_guan
  • 2014年11月24日 16:32
  • 3352

windows phone 7

http://msdn.microsoft.com/zh-cn/windowsphone/default.aspx?ocid=ban-n-cn-wp7--csdn
  • ITTA2011
  • ITTA2011
  • 2010年12月24日 12:09
  • 164

Windows Phone 7 学习

1. Emulator   **  One emulator can host applictions from multiple Visual 2010 instances.   **  Can u...
  • fr_rf
  • fr_rf
  • 2010年09月03日 13:19
  • 105

Windows Phone 7天气预报

学习WP7有一段时间了,做了个小应用程序,天气预报。 首先感谢Google给提供的天气API,因为找了半天也只有google是免费的。 主要功能,自己添加城市,然后加载城市4天内的天气情况...
  • wildfeng04
  • wildfeng04
  • 2012年01月07日 18:24
  • 608
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows Phone 7 自定义事件
举报原因:
原因补充:

(最多只允许输入30个字)