Windows Phone 7 利用计时器DispatcherTimer创建时钟
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),然后才会重新开始,也就是说
,要执行完->然后再等待时间->然后重复
时钟的例子:
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="利用定时器设计的时钟" Style="{StaticResource PhoneTextNormalStyle}"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"
SizeChanged="OnContentPanelSizeChanged">
<TextBlock Name="referenceText"
Text="参考对象文本控件"
/>
<TextBlock Name="hourHand">
<TextBlock.RenderTransform>
<CompositeTransform />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock Name="minuteHand">
<TextBlock.RenderTransform>
<CompositeTransform />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock Name="secondHand">
<TextBlock.RenderTransform>
<CompositeTransform />
</TextBlock.RenderTransform>
</TextBlock>
</Grid>
</Grid>
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 轴平移对象的距离
}
}
}
转载于:https://www.cnblogs.com/linzheng/archive/2011/02/16/1956487.html
Windows Phone 7 利用计时器DispatcherTimer创建时钟相关推荐
- java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...
进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...
- Windows 和Linux利用tftp协议传送文件
Windows 和Ubuntu利用tftp协议传送文件 这几天公司需要将一个文件从Windows7传到装在虚拟机中的Linux系统中,由于Linux系统只开了tftp协议的69端口,只能通过tftp协 ...
- Windows 下 C++ 利用 OpenCV glob 函数获取文件夹下所有文件绝对路径
绪论 本文记录 Windows 下 C++ 利用 OpenCv glob 函数得到 文件夹下所有文件的绝对路径(含文件名).本文还含有 std::string::find()等函数的记录.如果是 Py ...
- Windows非法文件和目录的创建及删除方式
目前遇到的windows非法文件和目录名主要有以下几种 1.带点的目录名 例子: d:/wwwroot/mysite/aaa.. 创建: md d:/wwwroot/mysite/aaa../ [wi ...
- 利用widget实现一个时钟功能小插件
利用widget实现一个时钟功能小插件 一般来说 widget 程序由以下部分组成: a. AppWidgetProvider 的实现 b. widget外观布局定义文件 c. widget 参数配 ...
- 西门子触摸屏脚本程序_西门子触摸屏利用VBScript脚本创建csv文件
功能描述:利用VBScript脚本创建csv/txt文件 有时需要将PLC或运动控制器Simotion中的数据写到SD卡或U盘上.一种实现方法是,如果使用的是精致面板(comfort panel),可 ...
- 解决水晶报表中动态加载的图片或利用水晶报表创建的图表不显示图片的方法
开发水晶报表时在利用其创建图表时在IIS服务器图片不显示,解决方法如下: 在解决方案资源管理器->web项目-->右键 属性页,把多余的 引用 移除就可以了(注意版本),例如VS2005版 ...
- 输入引脚时钟约束_Happy Design in Vivado 系列:时序分析入门三板斧(一):创建时钟...
本系列中我们将一起探寻 Xilinx FPGA 的硬件开发环境 Vivado,发现 Vivado 的 Design Flow,使用 Tips...或许再来一些 BUG?Happy Design in ...
- 利用css对shiny页面优化及利用htmlwidgets包创建HTML控件
内容来源:2017年5月20日,乐逗游戏高级数据分析师在"第十届中国R会议软件工具专场"进行<HTTPS最佳安全实践>演讲分享.IT大咖说作为独家视频合作方,经主办方和 ...
最新文章
- 中文语音识别pytorch
- [Python3] 003 变量类型概述 数字类型详叙
- 用java实现zip压缩
- [Linux]CRC校验
- Python入门教学之(转义字符与原字符)
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 34: ordinal not in range(128)
- 远程开启admin$共享(远程管理需开启如dameware软件)
- python websocket实现消息推送_python Django websocket 实时消息推送
- 【附干货】卸载CAD后将注册表清理干净的方法及步骤
- 将CCT色温转换成RGB
- UBUNTU-19.04的拼音输入法
- POJ 1008 玛雅日历
- 面经-腾讯前端开发工程师
- base64解码报错Illegal base64 character
- delphi 讲的比较详细的多线程(推荐)
- JAVA程序设计-头歌实训-------# 第一阶段 Java语言快速入门
- 在ThinkPHP中开启调试模式
- 帝国时代3java_帝国时代3-亚洲王朝
- Flash动画制作的基本步骤
- 第七史诗手游怎么用电脑玩 第七史诗电脑版玩法教程
热门文章
- Android用户界面
- Algorithm: 匈牙利算法
- java蓝桥杯算法训练 求1000以内的完数(题解)
- python 命令行解析模块_Python解析命令行读取参数 -- argparse模块
- (15)ZYNQ FPGA AXI-stream总线简介(学无止境)
- (228)FPGA岗位有哪些?
- (17)FPGA面试技能提升篇(System Verilog)
- linux批量执行一个脚本文件,shell脚本示例:批量比较多个文件的内容是否相同...
- 如何用python爬取公众号文章搜狗微信搜索_python抓取搜狗微信公众号文章
- STM32网络ETH