WPF学习————制作时钟

摘要:
话不多说,这个例子非常适合初学者。主要是路径。然后是RenderTransfer和数据绑定。如果您不熟悉,请先阅读相关知识。你也可以根据例子练习和学习。

话不多说,这个实例非常适合入门者。主要的东西是路径Path。然后是RenderTransfer和数据绑定。不熟悉的请先阅读相关知识,也可以根据实例来一边实践一边学习。

先上效果:WPF学习————制作时钟第1张

整体结构如下:

窗体设置: 

ResizeMode="NoResize" WindowStyle="None"

xaml层次:

WPF学习————制作时钟第2张

WPF学习————制作时钟第3张WPF学习————制作时钟第4张
 <Border Background="LightCyan">
        <Grid>
            <Ellipse Stroke="Black" StrokeThickness="10" Margin="10"></Ellipse>
            <Ellipse Stroke="Gray" StrokeThickness="1" Width="350" Height="350"></Ellipse>
            <Ellipse Stroke="Gray" StrokeThickness="1" Width="380" Height="380"></Ellipse>
            <Ellipse  StrokeThickness="5" Fill="White" Width="20" Height="20" Stroke="Black" ></Ellipse>

            <TextBlock Text="12" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="205" Y="50"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="1" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="290" Y="80"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="2" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="340" Y="130"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="3" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="370" Y="200"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="4" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="350" Y="280"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="5" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="300" Y="340"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="6" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="215" Y="360"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="8" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="80" Y="280"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="7" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="140" Y="340"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="9" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="60" Y="205"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="11" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="140" Y="80"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="10" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="85" Y="130"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="0" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="90" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="180" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="270" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="30" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="60" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="120" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="150" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="210" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="240" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>

            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="300" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="330" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Yellow" StrokeThickness="1" Name="seconds">
                <Path.RenderTransform>
                    <RotateTransform CenterX="225" CenterY="225" Angle="{Binding clockTimeData.second_indicate,  UpdateSourceTrigger=PropertyChanged}">
                        
                    </RotateTransform>
                </Path.RenderTransform>
                <Path.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF2BE60E" Offset="0.3"/>
                        <GradientStop Color="White" Offset="1"/>
                    </LinearGradientBrush>
                </Path.Fill>
                <Path.Data>
                    <PathGeometry Figures="M 225,60 220,200 225,225 225,250  225,225  230,200 z">
                    </PathGeometry>
                </Path.Data>
                <!--<Path.Triggers>
                    <EventTrigger RoutedEvent="Loaded">
                        --><!--<BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation 
                                    Storyboard.TargetName="seconds"
                                    Storyboard.TargetProperty="RenderTransform.Angle"
                                    Duration="00:01:00" From="0" To="360" By="6" RepeatBehavior="Forever"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>--><!--
                    </EventTrigger>
                </Path.Triggers>-->

            </Path>
            <Path  Stroke="Black" StrokeThickness="2">
                <Path.RenderTransform>
                    <RotateTransform CenterX="225" CenterY="225" Angle="{Binding clockTimeData.minius_indicate,  UpdateSourceTrigger=PropertyChanged}">

                    </RotateTransform>
                </Path.RenderTransform>
                <Path.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF157AF3" Offset="0.3"/>
                        <GradientStop Color="White" Offset="1"/>
                    </LinearGradientBrush>
                </Path.Fill>
                <Path.Data>
                    <PathGeometry Figures="M 225,80 215,200 225,225 225,250  225,225  235,200 z">

                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="2">
                <Path.RenderTransform>
                    <RotateTransform CenterX="225" CenterY="225" Angle="{Binding clockTimeData.hours_indicate,  UpdateSourceTrigger=PropertyChanged}">

                    </RotateTransform>
                </Path.RenderTransform>
                <Path.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFE233AA" Offset="0.3"/>
                        <GradientStop Color="White" Offset="1"/>
                    </LinearGradientBrush>
                </Path.Fill>
                <Path.Data>
                    <PathGeometry Figures="M 225,120 200,200 225,225 225,250  225,225  250,200 z">

                    </PathGeometry>
                </Path.Data>
            </Path>

        </Grid>
    </Border>
View Code

1:先设计静态的东西。时钟的面板上的,最外面的大黑圆。数值对应的分度圆。

WPF学习————制作时钟第5张WPF学习————制作时钟第6张
<Ellipse Stroke="Black" StrokeThickness="10" Margin="10"></Ellipse>
<Ellipse Stroke="Gray" StrokeThickness="1" Width="350" Height="350"></Ellipse>
<Ellipse Stroke="Gray" StrokeThickness="1" Width="380" Height="380"></Ellipse>
<Ellipse StrokeThickness="5" Fill="White" Width="20" Height="20" Stroke="Black" ></Ellipse>
View Code

2:设计数字,并安排到合适的位置,注意数值对应的黑点也是Path。

WPF学习————制作时钟第7张WPF学习————制作时钟第8张
 <TextBlock Text="12" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="205" Y="50"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="1" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="290" Y="80"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="2" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="340" Y="130"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="3" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="370" Y="200"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="4" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="350" Y="280"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="5" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="300" Y="340"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="6" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="215" Y="360"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="8" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="80" Y="280"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="7" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="140" Y="340"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="9" FontSize="35" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="60" Y="205"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="11" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="140" Y="80"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <TextBlock Text="10" FontSize="25" >
                <TextBlock.RenderTransform>
                    <TranslateTransform X="85" Y="130"></TranslateTransform>
                </TextBlock.RenderTransform>
            </TextBlock>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="0" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="90" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="180" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="3">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="270" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="30" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="60" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="120" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="150" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="210" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="240" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>

            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="300" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <PathGeometry Figures="M 225,35 225,50">
                        <PathGeometry.Transform>
                            <RotateTransform Angle="330" CenterX="225" CenterY="225"></RotateTransform>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </Path.Data>
            </Path>
View Code

3:用Path设计好时针,分针,秒针的形状,并加入渐变效果。

WPF学习————制作时钟第9张WPF学习————制作时钟第10张
  <Path  Stroke="Yellow" StrokeThickness="1" Name="seconds">
                <Path.RenderTransform>
                    <RotateTransform CenterX="225" CenterY="225" Angle="{Binding clockTimeData.second_indicate,  UpdateSourceTrigger=PropertyChanged}">
                        
                    </RotateTransform>
                </Path.RenderTransform>
                <Path.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF2BE60E" Offset="0.3"/>
                        <GradientStop Color="White" Offset="1"/>
                    </LinearGradientBrush>
                </Path.Fill>
                <Path.Data>
                    <PathGeometry Figures="M 225,60 220,200 225,225 225,250  225,225  230,200 z">
                    </PathGeometry>
                </Path.Data>
                <!--<Path.Triggers>
                    <EventTrigger RoutedEvent="Loaded">
                        --><!--<BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation 
                                    Storyboard.TargetName="seconds"
                                    Storyboard.TargetProperty="RenderTransform.Angle"
                                    Duration="00:01:00" From="0" To="360" By="6" RepeatBehavior="Forever"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>--><!--
                    </EventTrigger>
                </Path.Triggers>-->

            </Path>
            <Path  Stroke="Black" StrokeThickness="2">
                <Path.RenderTransform>
                    <RotateTransform CenterX="225" CenterY="225" Angle="{Binding clockTimeData.minius_indicate,  UpdateSourceTrigger=PropertyChanged}">

                    </RotateTransform>
                </Path.RenderTransform>
                <Path.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF157AF3" Offset="0.3"/>
                        <GradientStop Color="White" Offset="1"/>
                    </LinearGradientBrush>
                </Path.Fill>
                <Path.Data>
                    <PathGeometry Figures="M 225,80 215,200 225,225 225,250  225,225  235,200 z">

                    </PathGeometry>
                </Path.Data>
            </Path>
            <Path  Stroke="Black" StrokeThickness="2">
                <Path.RenderTransform>
                    <RotateTransform CenterX="225" CenterY="225" Angle="{Binding clockTimeData.hours_indicate,  UpdateSourceTrigger=PropertyChanged}">

                    </RotateTransform>
                </Path.RenderTransform>
                <Path.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFE233AA" Offset="0.3"/>
                        <GradientStop Color="White" Offset="1"/>
                    </LinearGradientBrush>
                </Path.Fill>
                <Path.Data>
                    <PathGeometry Figures="M 225,120 200,200 225,225 225,250  225,225  250,200 z">

                    </PathGeometry>
                </Path.Data>
            </Path>
View Code

4:建立时分秒对应的数据,并开notifypropertychange。

WPF学习————制作时钟第11张WPF学习————制作时钟第12张
 public class ClockTimeData:NotifyPropertyChange
    {


        public ClockTimeData()
        {
           

        }



        double _second_indicate;
        public double second_indicate
        {
            set
            {
                _second_indicate = value;
                RaisePropertyChanged(nameof(second_indicate));
            }
            get
            {
                return _second_indicate;
            }

        }




        double _minius_indicate;
        public double minius_indicate
        {
            set
            {
                _minius_indicate = value;
                RaisePropertyChanged(nameof(minius_indicate));
            }
            get
            {
                return _minius_indicate;
            }

        }
        public double hours_indicate
        {
            set;
            get;
        }
    }
View Code

5:建立ViewModel.搭建数据和UI的关联逻辑。

WPF学习————制作时钟第13张WPF学习————制作时钟第14张
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using WPFClock.Modles;
using MVVMLibrary.MVVMCommon;
using MVVMLibrary.MVVMBase;

namespace WPFClock.ViewModles
{
   public class ClolcTimeVM:ViewModelBase
    {

        public ClockTimeData clockTimeData
        {
            set;
            get;
        }

        Action Updateindicate;

        public ClolcTimeVM()
        {
            clockTimeData = new ClockTimeData();
            Updateindicate += Updateindicatefun;
            Updateindicate.BeginInvoke(
                ar=>Updateindicate.EndInvoke(ar)
                ,null);
        }

        private void Updateindicatefun()
        {
           while(true)
            {
                clockTimeData.second_indicate = DateTime.Now.Second*6.0;
                clockTimeData.minius_indicate = DateTime.Now.Minute * 6.0+ DateTime.Now.Second/60.0*6;
                double hour = DateTime.Now.Hour > 12 ? (DateTime.Now.Hour - 12) : DateTime.Now.Hour;
                 clockTimeData.hours_indicate = hour * 30.0+ DateTime.Now.Minute / 60.0*30;
                Thread.Sleep(200);
            }
        }
    }
}
View Code

6:将UI的datacontex设置到ViewModel.

WPF学习————制作时钟第15张WPF学习————制作时钟第16张
 <Window.DataContext>
        <vm:ClolcTimeVM></vm:ClolcTimeVM>
    </Window.DataContext>
View Code

7:运行后,时针,分针,秒针将根据当前的计算机时间来布置和运动。

WPF学习————制作时钟第17张WPF学习————制作时钟第18张
 clockTimeData.second_indicate = DateTime.Now.Second*6.0;
                clockTimeData.minius_indicate = DateTime.Now.Minute * 6.0+ DateTime.Now.Second/60.0*6;
                double hour = DateTime.Now.Hour > 12 ? (DateTime.Now.Hour - 12) : DateTime.Now.Hour;
                 clockTimeData.hours_indicate = hour * 30.0+ DateTime.Now.Minute / 60.0*30;
View Code

免责声明:文章转载自《WPF学习————制作时钟》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇最佳内存缓存框架Caffeine随手修改网页背景色,不再忍受刺眼网页下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

spring5 源码深度解析----- AOP的使用及AOP自定义标签

接下来我们就详细分析下spring中的AOP。AOP的使用在开始前,先引入Aspect。那么,Spring是如何实现AOP的呢?首先我们知道,SPring是否支持注解的AOP是由一个配置文件控制的,也就是,当在配置文件中声明了这句配置的时候,Spring就会支持注解的AOP,那么我们的分析就从这句注解开始。AOP自定义标签之前讲过Spring中的自定义注解,...

将Kafka收到的数据传入到redis中

首先,配置配置。在属性测试中,首先启动网络管理系统(GateWay),然后启动终端(TBox),然后运行KafkaTest启动TBox。在启动测试中可以看到收到的数据。然后关键是sdf,然后去你的xshell启动动物园管理员、kafka和redis...

Wayland 源码解析之代码结构

Wayland实现的代码组成可以分为以下四个部分:1.Wayland库的核心部分,大部分Wayland协议实现都位于该库中。1) 该工具程序分析Wayland协议文件并生成相应的头文件和代码文件。源代码文件列表:wayland/cursor/wayland cursor。通道/光标/通道光标。cwyland/cursor/os兼容性。cwyland/curs...

iTerm2 配色方案(转)

ITerm2配色方案(噢,我的zsh&amp;Powerline)item2.png转到官方网站下载ITerm2,并以全黑色背景打开它。屏幕截图2017-08-01下午5.45.28点。Pngsolarized可以说是目前网络上最流行的配色方案,我个人认为比较这种配色更好。第一种方法:打开iTerm2首选项、配置文件/颜色,然后直接选择Solariz...

selenium自动化之鼠标操作

,selenium为我们提供了一个处理此类事件的类——ActionChains。ActionChains可以模拟鼠标操作,例如单击、双击、右键单击、拖动等。鼠标移动时演示页面的截图:demo1.使用鼠标移动到WriteonOver按钮的顶部。python脚本如下:读取鼠标移动代码,首先定义浏览器驱动程序,最大化窗口,打开测试页面URL,定位到测试按钮顶部,定...

Corn表达式

CronTriggerCronTrigger通常比SimpleTrigger更有用。如果您需要基于日历的概念,而不是SimpleTrigger完全指定的时间间隔,则重复启动工作的时间表。CronTrigger,您可以指定触发器计划,例如“每周五中午”、“每工作日9:30”,甚至“每周一上午、周三和周五9:00和10:00每五分钟”。即使如此,就像Simple...