设为首页 收藏本站
查看: 763|回复: 0

Windows Phone 7 利用计时器DispatcherTimer创建时钟

[复制链接]

尚未签到

发表于 2015-5-9 10:55:04 | 显示全部楼层 |阅读模式
  DispatcherTimer是在System.Windows.Threading 命名空间下的定时器。集成到按指定时间间隔和指定优先级处理的 Dispatcher 队列中的计时器。  在每个 Dispatcher 循环的顶端重新计算 DispatcherTimer。 不能保证会正好在时间间隔发生时执行计时器,但能够保证不会在时间间隔发生之前执行计时器。 这是因为 DispatcherTimer 操作与其他操作一样被放置到 Dispatcher 队列中。 何时执行 DispatcherTimer 操作取决于队列中的其他作业及其优先级。
  每当将对象方法绑定到计时器时,DispatcherTimer 都将使对象保持活动状态。
DispatcherTimer  timer = new DispatcherTimer() ;
  timer.Tick += new EventHandler(timer_Tick);
  void timer_Tick()
  {}
  timer.Interval = new TimeSpan(TimeSpan.TicksPerSecond);
  首先,DispatcherTimer只会创建一个线程,竟然是一个线程,那么它的执行顺序就很明显,要等执行完成之后,才会重头开始执行。
  其实是这样的,每当线程执行完一次,等待Interval 设置的时间(比如上面我们设置了TicksPerSecond),然后才会重新开始,也就是说
  ,要执行完->然后再等待时间->然后重复
  时钟的例子:
DSC0000.jpg





        
            
            
        
        
        
            
        
        
        
            
            
               
                    
               
            
            
               
                    
               
            
            
               
                    
               
            
        
   



using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
using Microsoft.Phone.Controls;
namespace HybridClock
{
    public partial class MainPage : PhoneApplicationPage
    {
        Point gridCenter;
        Size textSize;
        double scale;
        public MainPage()
        {
            InitializeComponent();
            DispatcherTimer tmr = new DispatcherTimer();//创建计时器
            tmr.Interval = TimeSpan.FromSeconds(1);//TimeSpan 结构  表示一个时间间隔。
            //DispatcherTimer.Interval 属性 获取或设置计时器刻度之间的时间段。
            //不能保证会正好在时间间隔发生时执行计时器,但能够保证不会在时间间隔发生之前执行计时器。
            //这是因为 DispatcherTimer 操作与其他操作一样被放置到 Dispatcher 队列中。
            //何时执行 DispatcherTimer 操作取决于队列中的其他作业及其优先级。
            tmr.Tick += OnTimerTick;//DispatcherTimer.Tick 事件 超过计时器间隔时发生。
            tmr.Start();//计时器开始
        }
        //这个事件会在刚进入这个grid面板的时候触发
        //从而可以确定grid ContentPanel的准确高度和宽度
        void OnContentPanelSizeChanged(object sender, SizeChangedEventArgs args)//ContentPanel的ActualHeight 或 ActualWidth 属性的值发生更改时发生。
        {   
            gridCenter = new Point(args.NewSize.Width / 2,
                                   args.NewSize.Height / 2);
            textSize = new Size(referenceText.ActualWidth,
                                referenceText.ActualHeight);//这个就是grid的内的高度和宽度

            scale = Math.Min(gridCenter.X, gridCenter.Y) / textSize.Width;
            UpdateClock();
        }
        //计时器触发的事件函数
        void OnTimerTick(object sender, EventArgs e)
        {
            UpdateClock();
        }
        void UpdateClock()
        {
            DateTime dt = DateTime.Now;
            double angle = 6 * dt.Second;
            SetupHand(secondHand, "--------------秒针 " + dt.Second, angle);
            angle = 6 * dt.Minute + angle / 60;
            SetupHand(minuteHand, "---------分针 " + dt.Minute, angle);
            angle = 30 * (dt.Hour % 12) + angle / 12;
            SetupHand(hourHand, "------时针 " + (((dt.Hour + 11) % 12) + 1), angle);
        }
        void SetupHand(TextBlock txtblk, string text, double angle)
        {
            txtblk.Text = text;
            CompositeTransform xform = txtblk.RenderTransform as CompositeTransform;//获取txtblk的RenderTransform 属性 并转化为CompositeTransform
            xform.CenterX = textSize.Height / 2;//移动的中心点的 x 坐标
            xform.CenterY = textSize.Height / 2;//移动的中心点的 y 坐标
            xform.ScaleX = scale;//设置 x 轴的缩放比例
            xform.ScaleY = scale;//设置 y 轴的缩放比例
            xform.Rotation = angle - 90;//获取或设置顺时针旋转角度(以度为单位)
            xform.TranslateX = gridCenter.X - textSize.Height / 2;//设置沿 x 轴平移对象的距离
            xform.TranslateY = gridCenter.Y - textSize.Height / 2;//设置沿 y 轴平移对象的距离
        }
    }
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65190-1-1.html 上篇帖子: Windows Phone 7 不温不火学习之《数据绑定与应用程序栏》 下篇帖子: TechED2010与我(二)—— Windows Phone 7 Develop
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表