UWP实现时钟

UWP现在的开发确实很方便,不过资料真的好少啊。。。

前些天看到同学有实实现自定义的时钟,这东东挺简单的,就自己也写个,没成想,遇到个坑,费了好长时间,记下来一下。

效果图:

画个圆,三条线就好。XAML代码如下:

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <Ellipse x:Name="ellipse" Stroke="Black"/>
            <Line x:Name="line_Second" Stroke="Red" StrokeThickness="3"/>
            <Line x:Name="line_Minute" Stroke="Blue" StrokeThickness="2"/>
            <Line x:Name="line_Hour" Stroke="Black" StrokeThickness="1"/>
</Grid>

C#代码:

 public sealed partial class MainPage : Page
    {
        DispatcherTimer timer;//定义定时器
        double ScreenHeight;
        double ScreenWidth;
        double ellipseWidth;
        const double PI = 3.1415926;
        const double lineLength_Second=250;
        const double lineLenght_Minute = 200;
        const double lineLenght_Hour = 150;
        static int second;
        static int minute;
        static int hour;

        public MainPage()
        {
            this.InitializeComponent();
            timer = new DispatcherTimer();
            timer.Interval = new TimeSpan(0, 0, 1);
            timer.Tick += Timer_Tick;//每秒触发这个事件,以刷新指针
            timer.Start();
        }

        private void Timer_Tick(object sender, object e)
        {
            line_Second.X1 = Window.Current.Bounds.Width / 2;
            line_Second.Y1 = Window.Current.Bounds.Height / 2;

            line_Minute.X1= Window.Current.Bounds.Width / 2;
            line_Minute.Y1=Window.Current.Bounds.Height / 2;

            line_Hour.X1= Window.Current.Bounds.Width / 2;
            line_Hour.Y1= Window.Current.Bounds.Height / 2;

            //秒针
            second = DateTime.Now.Second;
            double radius_second =  PI * second / 30;
            line_Second.X2 = lineLength_Second * Math.Sin(radius_second)+ line_Second.X1;
            line_Second.Y2 = line_Second.Y1- lineLength_Second * Math.Cos(radius_second);

            //分针
            minute = DateTime.Now.Minute;
            double radius_minute=  PI * minute / 30;
            line_Minute.X2 = lineLenght_Minute * Math.Sin(radius_minute) + line_Minute.X1;
            line_Minute.Y2 = line_Minute.Y1-lineLenght_Minute * Math.Cos(radius_minute);

            //时针
            hour = DateTime.Now.Hour;
            double radius_hour = hour*PI/6+radius_minute/12;
            line_Hour.X2 = lineLenght_Hour * Math.Sin(radius_hour) + line_Hour.X1;
            line_Hour.Y2 = line_Hour.Y1 - lineLenght_Hour * Math.Cos(radius_hour);
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            //获取窗口实际长宽,以下就是为了适用不同窗体,
            //圆甚至直线的长度也要随窗体变化
            ScreenHeight = Window.Current.Bounds.Height;
            ScreenWidth = Window.Current.Bounds.Width;

            ellipseWidth = ScreenWidth > ScreenHeight ? ScreenHeight - 20 : ScreenWidth - 20;
            ellipse.Height = ellipseWidth;
            ellipse.Width = ellipseWidth;
        }
    }

基础不太好,结果好久才把指针搞对,原因是我对UWP的角度的0°位置不清楚:

窗体左上角为坐标原点,而角度的0°位置如图,调了好久,我还以为写错了,原来是坐标系搞错了,哎

时间: 2024-11-05 15:48:18

UWP实现时钟的相关文章

【UWP通用应用开发】编辑文本、绘制图形、3D透视效果及绘制时钟实战

编辑文本及键盘输入 相信大家都会使用TextBox,但如果要让文本在TextBox中换行该怎么做呢?将TextWrapping属性设置为Wrap,将AcceptsReturn属性设置为True就好咯. PasswordBox很明显就是一个密码框了,和其他的控件相比其有2个特殊之处,一个是其可以用MaxLength来控制最大的长度,一个是用PasswordChanged来捕捉密码的改名.显然比如QQ密码的MaxLength就是16位了,而PasswordChanged可以用来监测比如用户设置的密码

UWP -- Background Task 深入解析

原文:UWP -- Background Task 深入解析 1. 重点 锁屏问题 从 Windows 10 开始,用户无须再将你的应用添加到锁屏界面,即可利用后台任务,通用 Windows 应用必须在注册任何后台触发器类型之前调用 RequestAccessAsync: await BackgroundExecutionManager.RequestAccessAsync(); 资源限制 由于对于内存较低的设备的资源约束,后台任务可能具有内存限制,该限制决定了后台任务可以使用的内存上限 在内存

nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 .而近期会加入的文章将主要是算法和Android.只是其他内容也会继续完好. About the Author 独立 Windows App 和

UWP开发中的重复性静态UI绘制小技巧 1

介绍 在UWP界面实现的过程中,有时会遇到一些重复性的.静态的界面设计.比如:画许多等距的线条,画一圈时钟型的刻度线,同特别的策略排布元素,等等. 读者可能觉得这些需求十分简单,马上就想到了通过for循环之类来实现.只需要在Loaded事件里添上这些元素就好了. 但这样可能存在一些问题——如果这些UI元素只是静态的,是装饰性的——虽然code-behind不用白不用,但为了这些纯静态元素将代码逻辑变得臃肿似乎略有不妥. 我们将就这些问题为读者们介绍一些重复性的静态界面绘制小技巧. Shape.S

Windows 10 UWP 部署

原文  http://youthlin.com/20151105.html 我们知道VS连接手机可以直接部署到手机里,但平板貌似无法这样干,平板与电脑连接没有丝毫反应……那么想看VS里写的uwp应用在平板上的运行情况怎么办呢? 如果是本机电脑的话,也可以直接调试,要是平板———— 当然是部署啦,不过怎么部署呢,网上搜到的有命令行 winappdeploycmd.exe 命令的,有Win8.1时代部署方法的,我用winappdeploycmd.exe试了一下,一直无法找到设备,连手机也搜不到,于是

Windows 10 UWP程序标题栏设置

原文:Windows 10 UWP程序标题栏设置 在Windows 10程序中,以前只能用于全屏方式的Metro程序现在可以运行在窗口模式下了,并且改了个新名字,叫Windows 通用程序(Universal Windows app),简称UWP程序.新的UWP程序虽然大体上还是和以前的Metro程序差不多的,但还是引入了一点新东西的,本文这里就介绍一下它的标题栏设置的几个特性. 隐藏标题栏: 将应用界面扩展至 Titlebar 区域 CoreApplication.GetCurrentView

设置UWP程序自启动(Automate launching Windows 10 UWP apps)

原文:设置UWP程序自启动(Automate launching Windows 10 UWP apps) 在开发UWP程序的过程中,有时候需要设置程序的自启.本人实现的步骤如下: 1.在VS中激活Protocol (Package.appxmanifest --> Declarations --> Add Protocol),图示如下: 2.编译并发布项目(Build and Deploy) 发布之后Protocol被激活,在(控制面板 --> 程序 --> 默认程序 -->

门控时钟-理论分析 ---- 转载

转载自:http://www.chipsbank.com/news_detail/newsId=123.html 门控的基本要求: 1. 所需要的沿(对于正沿触发的寄存器是正沿,对于负沿触发的寄存器是负沿)不增加,不减少: 1. 不会产生毛刺: 1. 使用后功耗要能够降低: 1. 最好面积还会减小. 1. 上升沿触发的门控时钟的结构研究:应用与上升沿触发的寄存器的门控. 1. 直接与门结构: 1. 高电平使能Latch + 与门结构: 1. 低电平使能Latch + 与门结构: 1. 波形研究:

【JAVA语言程序设计基础篇】--图形-- 三种时钟--增强对类的理解和应用

1.显示任意时间时钟 2.设置三个可见性属性 分别表示时针,分针,秒针的可见性 3.一个精细的时钟 主类:StillClock @SuppressWarnings("serial") class DetailedClock extends JPanel { private int hour; private int minute; private int second; protected int xCenter, yCenter; protected int clockRadius;