wpf时钟程序(总结)

   学C#没多久,培训了一个星期刚讲到WPF,就来任务了。需要写一个WPF程序,要用数据绑定和线程来写一个转动的时钟。

想想就郁闷,C#基础还没学好,XAML也不熟,对前台和后台线程还没有一个清楚的概念。就在这样的情况下开始写了自己的第一个WPF程序。。

    构思了一下:UI就做简单点好了,画个圆当表盘,然后用三个Rectangle当做指针吧,转动就用RotateTransform类来做,把角度和后面的类的属性绑定就行了绑定写法MSDN上有,注意是TwoWay的MODE就是了。。

    前面是搞定了剩下的就是后面逻辑表示的代码了。写了一个绑定用到的类,实现了INotifyPropertyChanged接口的PropertyChanged方法,这样当这个类的属性改变后就会自己动通知绑定的UI属性,当然绑定源必需是DependencyProperty类型的。

    然后,用了一个Timer设置一秒的时间间隔,我把角度的变化和类属性改变的函数都放在了Timer的Elapsed事件里用线程来处理,

后台线程要更新UI直接写是不行的,可以用Dispatcher,Dispatcher  类提供两个注册工作项的方法:Invoke 和 BeginInvoke;这两个方法均调度一个委托来执行。Invoke 是同步调用, 也就是说,直到 UI 线程实际执行完该委托它才返回。BeginInvoke 是异步的,将立即返回。这样在我设置的时间间隔内类的属性在跟系统时间变化,这样UI的属性Rectangle的角度,也会被通知更新,绑定就完成了!

后面想想为了美观,个表盘用了个ICO可以自己找找代替吧

 

代码如下:XAML

<Window x:Class="WpfApplication2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:WpfApplication2"
    Title="Window1" Margin="2" Height="327" Width="311" AllowsTransparency="True"
        WindowStyle="None" Background="Transparent" WindowStartupLocation="CenterScreen"
        Icon="clock.ico"
        ResizeMode="NoResize" Topmost="False" Opacity="1">
 
    <Grid  x:Name="grid" Width="300" Height="300">
      
       
        <Image Source="images/backGround.png"></Image>
       
            <!-- Second  -->
        <Rectangle  Margin="150,0,149,150" Name="rectangleSecond" Stroke="White" Height="120" VerticalAlignment="Bottom">
            <Rectangle.RenderTransform>
                <RotateTransform x:Name="secondHand" CenterX="0" CenterY="120" Angle="{Binding  Path=Second,Mode=TwoWay}" />
            </Rectangle.RenderTransform>
        </Rectangle>
        <!-- -->

        <!-- Minute  -->
        <Rectangle Margin="150,49,149,151" Name="rectangleMinute" Stroke="LightGreen">
            <Rectangle.RenderTransform>
                <RotateTransform x:Name="minuteHand" CenterX="0" CenterY="100" Angle="{Binding Path=Minute,Mode=TwoWay}" />
            </Rectangle.RenderTransform>
        </Rectangle>
        <!-- -->
        <!-- Hour  -->
        <Rectangle Margin="150,80,149,150" Name="rectangleHour" Stroke="LightYellow">
           
            <Rectangle.RenderTransform>
                <RotateTransform x:Name="hourHand" CenterX="0" CenterY="70" Angle="{Binding  Path=Hour,Mode=TwoWay}"  />
            </Rectangle.RenderTransform>
        </Rectangle>
        <!---->
    </Grid>

</Window>

。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。

 

后台代码:.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        System.Timers.Timer timer = new System.Timers.Timer(1000);
        public Window1()
        {
            InitializeComponent();
            DateTime date = DateTime.Now;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
        }

        /// <summary>
        /// 计算时钟转动角度
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
           
            Clock cl = new Clock();
            //后台线程可以请求 UI 线程代表它执行操作。
            //这是通过向 UI 线程的 Dispatcher 注册工作项来完成的。
            //Dispatcher 类提供两个注册工作项的方法:Invoke 和 BeginInvoke。
            //这两个方法均调度一个委托来执行。Invoke 是同步调用,
            //也就是说,直到 UI 线程实际执行完该委托它才返回。
            //BeginInvoke 是异步的,将立即返回。
            this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
            {
                cl.Second = DateTime.Now.Second * 6;
                cl.Minute= DateTime.Now.Minute * 6;
                cl.Hour= (DateTime.Now.Hour * 30) + (DateTime.Now.Minute * 0.5);
                grid.DataContext = cl;
               

            }));
        }
    }
    /// <summary>
    /// 数据绑定类
    /// </summary>
    public class Clock :INotifyPropertyChanged
    { 
        #region NotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string info)
        {
           
            if (PropertyChanged != null)
            { //实现INotifyPropertyChanged中的PropertyChanged方法
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }

        }
        #endregion
        #region Property Members
        private double hour = 0;
        public double Hour
        {
            get { return hour; }
            set
            {
                if (value != hour)
                {
                    hour = value;
                    NotifyPropertyChanged("Hour");
                }
            }
        }

        private double minute = 0;
        public double Minute
        {
            get { return minute; }
            set
            {
                if (value != minute)
                {
                    minute = value;
                    NotifyPropertyChanged("Minute");
                }
            }
        }

        private double second = 0;
        public double Second
        {
            get { return second; }
            set
            {
                if (value != second)
                {
                    second = value;
                    NotifyPropertyChanged("Second");
                }
            }
        }
        #endregion

    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值