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 7 中 HubTile控件自定义大小。

Toolkit(http://silverlight.codeplex.com/)中有一个不错的控件:HubTile。 但这个控件只能用于173*173的Tile,如果想放其他尺寸的的就麻烦一些了(...

自定义odata数据源(Producing and Consuming OData in a Silverlight and Windows Phone 7 application (Part 1))

Producing and Consuming OData in a Silverlight and Windows Phone 7 application (Part 1) 原文:http...

Windows Phone 7中,如何自定义ProgressBar的高度,颜色,和透明度

WP7中默认的ProgressBar样式,有可能不太符合程序的要求,那么有时候就需要对其样式进行定制.既然要定制控件样式,那么就要请出神器Blend.用Blend打开页面,然后选中需要定制样式的Pro...

创建自定义Windows phone 7样式(二)-mango下的实现

有关mango前版本的主题设置可见我前一篇文章:(译)创建自定义WP7主题-简单的主题实现 最近开始做mango下的开发,发现以前的自定义主题方法在这里行不通了(感谢@阿甘.Net),主要的问题...
  • antsnm
  • antsnm
  • 2011年08月31日 14:30
  • 3017

Windows Phone 7 自定义按钮的实现

这段时间着手公司的windows phone7的开发项目,因为项目中许多地方都要用到不同风格式样的按钮, 对phone7也大致研究了下,想要完美的制作精美的按钮,对expression blend也...

Windows Phone Runtime 8.1 按返回键彻底关闭App -- 重新定义硬件返回键的事件

Windows Phone Runtime 8.1里面的坑不止一点点,最明显的是很多应用以前可以通过按返回键关闭,但是在8.1之 后,如果你用了WinRT的runtime写程序,就会发现返回键的行为仅...

windows phone 7 中怎样定义和使用资源(Resource)

1. 系统资源。 在wp7开发中可以看到很多使用系统资源(resource)的例子,例如默认的新page: 这里的PhoneTextTitle1Style便是资源。 系统的资源定义在...

Windows Phone 8.1中自定义用户控件及如何调用用户控件

结合之前一篇提及到的XAML语法和开头的定义的说明,这边借自定义用户控件和引用自定义控件进一步说明。 之前博客中见到XAML开头定义的各种说明链接: Windows Phone 8.1中的.xaml...

Windows Phone 自定义弹出框和 Toast 通知

工程源码下载   注:这篇文章主要介绍在 应用全局所有页面使用的自定义弹出框,如果仅在 MainPage 页面询问用户是否 是否退出,可参考: 简化版“询问用户是否退出”   1、 首先介绍如何自定义...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows Phone 7 自定义事件
举报原因:
原因补充:

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