WPF实时时间显示demo(MVVM)

本文介绍了如何通过B站视频学习,使用C#和MVVM模式创建一个界面,实现实时时间刷新。作者详细描述了界面设计、ViewModel层的构建,包括INotifyPropertyChanged的使用和DispatcherTimer的定时更新机制。
摘要由CSDN通过智能技术生成

        跟着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;
        }
    }

以下是一个简单的WPF MVVM应用程序示例: 首先,创建一个Model类,如下所示: ```csharp public class Person { public string Name { get; set; } public int Age { get; set; } } ``` 接下来,创建一个ViewModel类,如下所示: ```csharp public class PersonViewModel : INotifyPropertyChanged { private Person person; public PersonViewModel() { person = new Person(); } public string Name { get { return person.Name; } set { person.Name = value; OnPropertyChanged("Name"); } } public int Age { get { return person.Age; } set { person.Age = value; OnPropertyChanged("Age"); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 在ViewModel中,我们创建了一个Person对象,并暴露了其Name和Age属性,这些属性都实现了INotifyPropertyChanged接口,用于通知UI层的绑定属性已经改变。 最后,创建一个View类,如下所示: ```xml <Window x:Class="WpfMVVMDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfMVVMDemo" Title="MainWindow" Height="150" Width="250"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Label Grid.Row="0" Grid.Column="0" Content="Name:"/> <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Name}"/> <Label Grid.Row="1" Grid.Column="0" Content="Age:"/> <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Age}"/> <Button Grid.Row="2" Grid.Column="1" Content="Submit"/> </Grid> </Window> ``` 在View中,我们使用了绑定来将UI元素与ViewModel中的属性关联起来,这样当ViewModel中的属性发生变化时,UI层也会自动更新。 最后,我们需要在View的代码中将ViewModel与View关联起来,如下所示: ```csharp public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new PersonViewModel(); } } ``` 这样,我们就完成了一个简单的WPF MVVM应用程序的示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值