zoukankan      html  css  js  c++  java
  • Windows Phone 7 自定义事件

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

     运行的效果如下:

  • 相关阅读:
    我的2018:OCR、实习和秋招
    【OCR技术系列之六】文本检测CTPN的代码实现
    【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)
    如何免费使用谷歌搜索
    CUDA编程之快速入门
    我在北京实习的四个月
    在C++98基础上学习C++11新特性
    Linux编程之线程池的设计与实现(C++98)
    ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
    ASP.NET Core文件上传与下载(多种上传方式)
  • 原文地址:https://www.cnblogs.com/linzheng/p/2418811.html
Copyright © 2011-2022 走看看