频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

如何制作简单的WPF时钟(1)

作者: Johnson 出处:Csdn博客 2007-10-29 13:01    砖    好    评论   进入论坛
阅读提示:本文作者给出了使用WPF时钟的大部分源代码,供大家参考!

【引自Johnson的博客】进入WPF时代了,如何用WPF绘制一个时钟呢?

先看效果:

时钟效果图

上面显示的是时间值,下面是图形版的时钟。

制作要点:

1、首先在Expression Blend中画出时钟的样式;
2、建立时钟的程序辅助类;
3、将此时钟样式需要动态换掉的部分改成相应的绑定值。

由于具体步骤很多,这里只说说技术难点和要点,着重说明上述第2点部分。

// 时钟控件类:Clock.cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Timers;
using System.Windows.Threading;

namespace BrawDraw.Com.WPF.Clock.ControlLibrary
{
/// <summary>Clock Control
/// </summary>

public class Clock : Control
{
private DispatcherTimer timer;

static Clock()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Clock),
new FrameworkPropertyMetadata(typeof(Clock)));
}

protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
timer = new DispatcherTimer();
timer.Tick += new EventHandler(Timer_Tick);
timer.Start();
  }

private void Timer_Tick(object sender, EventArgs e)
{
UpdateDateTime();
timer.Interval = TimeSpan.FromMilliseconds(1000 -

DateTime.Now.Millisecond);
}

private void UpdateDateTime()
{
this.DateTime = System.DateTime.Now;
}

#region DateTime property
public DateTime DateTime
{
get
{
return (DateTime)GetValue(DateTimeProperty);
}
private set
{
SetValue(DateTimeProperty, value);
}
}

public static DependencyProperty DateTimeProperty =
DependencyProperty.Register(
"DateTime",
typeof(DateTime),
typeof(Clock),
new PropertyMetadata(DateTime.Now,
new PropertyChangedCallback(OnDateTimeInvalidated)));

public static readonly RoutedEvent DateTimeChangedEvent =
EventManager.RegisterRoutedEvent("DateTimeChanged",
RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<DateTime>),

typeof(Clock));

protected virtual void OnDateTimeChanged(DateTime oldValue,
DateTime newValue)
{
RoutedPropertyChangedEventArgs<DateTime> args =
new RoutedPropertyChangedEventArgs<DateTime>(oldValue, newValue);
args.RoutedEvent = Clock.DateTimeChangedEvent;
RaiseEvent(args);
}

private static void OnDateTimeInvalidated(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
Clock clock = (Clock)d;

DateTime oldValue = (DateTime)e.OldValue;
DateTime newValue = (DateTime)e.NewValue;

clock.OnDateTimeChanged(oldValue, newValue);
}
#endregion
}
}

// 时钟内部时针、分针、秒针角度计算及星期显示的类: ClockConverters.cs
// 由于WPF中旋转角度是以度单位,计算为绕一个圆周时,为360度。所以,计算时以360度来计算。
using System;
using System.Globalization;
using System.Windows.Data;

namespace BrawDraw.Com.WPF.Clock
{
// 一分钟60秒,一周为360度,所以,一秒钟就占6度,所以是:秒数×6。
[ValueConversion(typeof(DateTime), typeof(int))]
public class SecondsConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,

CultureInfo culture)
{
DateTime date = (DateTime)value;
return date.Second * 6;
}

public object ConvertBack(object value, Type targetType, object parameter,

CultureInfo culture)
{
return null;
}
}

// 一小时是60分钟,一周为360度,所以,一分钟就占6度,所以是:分钟数×6。
[ValueConversion(typeof(DateTime), typeof(int))]
public class MinutesConverter : IValueConverter
{
public object Convert(object value, Type targetType,

object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return date.Minute * 6;
}

public object ConvertBack(object value, Type targetType,

object parameter, CultureInfo culture)
{
return null;
}
}

// 时钟上显示12小时,一周为360度,这样,每小时占30度,考虑分钟所占角度是分钟数/2,

所以结果是:小时数×30 + 分钟数/2。
    [ValueConversion(typeof(DateTime), typeof(int))]
public class HoursConverter : IValueConverter
{
public object Convert(object value, Type targetType,

object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return (date.Hour * 30) + (date.Minute / 2);
}

public object ConvertBack(object value, Type targetType,

object parameter, CultureInfo culture)
{
return null;
}
}

[ValueConversion(typeof(DateTime), typeof(string))]
public class WeekdayConverter : IValueConverter
{
public object Convert(object value, Type targetType,

object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return date.DayOfWeek.ToString().Substring(0,3);
}

public object ConvertBack(object value, Type targetType,

object parameter, CultureInfo culture)
{
return null;
}
}
}


共2页: 1 [2] 下一页
【内容导航】
关于 WPF  时钟  图形
专题
初探敏捷开发
WCF开发基础
体验Visual Studio 2008的魅力
Visual Studio 2005开发基础
测试开发人员参考手册
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看81024次)
·UML类图详解 (查看72498次)
·C++是垃圾语言?! (查看42631次)
·C#技术开发指南 (查看40232次)
·UML统一建模语言 (查看39205次)
·Java编程开发手册 (1198个砖)
·Java基础教程 (431个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (254个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (658个好)
·Java基础教程 (578个好)
·.NET开发手册 (282个好)
·PB开发教程 (213个好)
·Delphi开发技术手册 (200个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。