科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件如何制作简单的WPF时钟

如何制作简单的WPF时钟

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文作者给出了使用WPF时钟的大部分源代码,供大家参考!

作者:Johnson 来源:Csdn博客 2007年11月19日

关键字: 制作 WPF 时钟

  • 评论
  • 分享微博
  • 分享邮件
进入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;
}
}
}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章