WPF实时时间显示demo(MVVM)

跟着b站的视频学习做一个界面,它里面的时间不能实时刷新,因此自己研究写一个,同时加深一下自己对MVVM的理解.

运行结果:

实现步骤:

1.界面

界面设计就是放置了一个TextBlock,它的text绑定了ViewModel层里面的公告属性CurrentTime.

复制代码
<Grid>
        <TextBlock Text="{Binding CurrentTime}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"></TextBlock>
    </Grid>

2.ViewModel层构建

新建了一个TimeViewModel.cs的文件

在这个文件中,我首先让文件继承了INotifyPropertyChanged类,随机实现接口用于发放改变通知.然后我定义私有字段_currentTime和公有属性CurrtTime(与前端界面绑定的属性),在其set中设置监听,当属性改变时触发 PropertyChanged 事件,通知界面进行改变.之后,进行定时器的配置,在构造函数之中进行配置,设置为1s一变,并且将Time_Tick添加为Tric时间处理程序,Time_Trick里面绑定的是时间更新函数,至此实现整个流程成功.

复制代码
 /// <summary>
    /// 管理时间和通知UI更新
    /// </summary>
    class TimeViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string _currentTime;
        private DispatcherTimer _timer;

        //构造函数
        public TimeViewModel()
        {
            _timer = new DispatcherTimer();
            _timer.Interval = TimeSpan.FromSeconds(1);//更新频率设为每秒
            _timer.Tick += Time_Tick;
            _timer.Start();
            /*
             *从这一刻开始,_timer 开始计数。
             *每当 _timer 的时间间隔(1秒)到达时,它都会触发 Tick 事件。
             *由于 Timer_Tick 方法被添加为 Tick 事件的事件处理程序,因此每次 Tick 事件被触发时,Timer_Tick 方法都会被调用。
             *在 Timer_Tick 方法内部,调用了 UpdateTime 方法来更新 _currentTime 字段,
             *并由于 _currentTime 字段的 set 访问器内部调用了 OnPropertyChanged 方法,
             *这会导致 PropertyChanged 事件被触发,
             *通知任何监听这个事件的UI组件或其他对象,CurrentTime 属性的值已经改变。
             */

            updateTime();//初始化
        }

        private void Time_Tick(object sender, EventArgs e)
        {
            updateTime();
        }

        private void updateTime()
        {
            CurrentTime = DateTime.Now.ToString("HH:mm:ss");
        }

        public string CurrentTime
        {
            get { return _currentTime; }
            set {
                _currentTime = value;
                OnPropertyChanged(nameof(CurrentTime));
            }
        }

        private void OnPropertyChanged(string v)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,new PropertyChangedEventArgs(v));
            }
        }

       
    }

3.实例化TimeViewModel,并且设计数据上下文,让界面和ViewModel层完成最后的绑定

复制代码
    public partial class MainWindow : Window
    {
        private TimeViewModel _viewModel;
        public MainWindow()
        {
            InitializeComponent();
            _viewModel = new TimeViewModel();
            this.DataContext = _viewModel;
        }
    }
相关推荐
优橙教育10 分钟前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
BLUcoding27 分钟前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
SEO_juper35 分钟前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
yuniko-n43 分钟前
【JUC】Lock 和 synchronzied 锁
java
西柚小萌新1 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
北极有牛1 小时前
cpp学习笔记--常量指针
java·开发语言·算法
java资料站1 小时前
二、Spring AI Alibaba · ChatModel
java·windows·spring
半杯咖啡半行码1 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
十年Java程序媛1 小时前
Java 接口和抽象类对比|Java8 新特性,抛弃老旧八股,正确选型
java·spring boot·后端
caoerzhong1 小时前
JeeWMS 开源 WMS 部署避坑指南:Java 仓库管理系统的环境基线、四类根因与可复现交付
java·开发语言·开源