在WPF窗口中显示时间

5

我正在创建一个WPF应用程序,我想让一个名为SystemTimeLabel的标签显示时间。 时间,就是时间。 我希望它显示当前时间,而不仅仅是加载时的时间。(因此,您可以看到数字时钟滴答声。)我认为while语句会有用,但我意识到它不会。 有什么想法?


2
可能是https://dev59.com/P3A75IYBdhLWcg3wVXav的重复问题。 - Manfred Radlwimmer
如果您查看文档,其中一个示例正是这个 https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer(v=vs.110).aspx - paparazzo
3个回答

4

如果您想遵循MVVM模式,datetime的主要问题在于它没有实现INotifyPropertyChanged接口。因此,尽管您可以将datetime属性绑定到标签上,但它不会自动更新。因此,您只需要在ViewModel中为datetime属性实现更新通知。创建一个具有更改通知的公共属性,并启动一个定时器以每半秒左右更新该属性。然后将标签的内容绑定到该属性。

public class MyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private DateTime _now;

    public MyViewModel()
    {
        _now = DateTime.Now;
        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(500);
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
    }

    public DateTime CurrentDateTime
    {
        get {return _now;}
        private set
        {
            _now = value;
            PropertyChanged(this, new PropertyChangedEventArgs("CurrentDateTime"));
        }
    }

    void timer_Tick(object sender, EventArgs e)
    {
        CurrentDateTime = DateTime.Now;
    }

}

<Label x:Name="SomeLabel" Content="{Binding CurrentDateTime}" ContentStringFormat="yyyy-MM-dd HH:mm:ss" />

你能给我源代码吗? - Aravind Suresh Thakidayil
1
进一步补充您的答案,如果我可以的话:在一个私有字段中存储计时器也会非常有用,以防您想在另一个时间控制计时器,或者如果您需要停止它并取消订阅其.Tick事件。 - Geoff James
我不明白为什么你要使用DispatcherTimer,如果你要像普通计时器一样使用它。 - paparazzo
一个计时器就是一个计时器,它只是定期触发事件。你还有什么其他建议使用它吗? - Drunken Code Monkey

3
当然可以-您只需要定期更新标签,这可以通过DispatcherTimer轻松完成。 只需注册一个事件以每秒10次的频率触发,并在每次事件触发时使用系统时间更新标签。
(请注意,即使您每秒实际上只更改一次文本,也不要仅在每秒执行一次此操作,否则由于计时器未精确地每秒触发一次,可能会出现奇怪的效果,似乎偶尔暂停两秒钟。)
可能可以使用WPF动画来完成此操作,但是计时器感觉更自然一些。

嗯...看,我不是一个非常有经验的C#程序员,但你能告诉我DispatchTimer是如何工作的吗?你还能告诉我Visual Studio的引用名称吗?因为VS告诉我没有这样的东西。 - Aravind Suresh Thakidayil
请访问此链接 http://www.tutorialspoint.com/csharp/,花几个小时看看,然后回来到Stack Overflow。 - Nazmul Hasan
@AravindSuresh:我已经链接了文档,它将告诉您要导入哪个命名空间并提供一个示例。 - Jon Skeet
@NazmulHasan 不用了,因为我已经完成了一门C#基础课程。 - Aravind Suresh Thakidayil
@NazmulHazan 我只是对调度部分不熟悉,你知道的。 C# 是非常庞大的。 没有人能够全部掌握它。 - Aravind Suresh Thakidayil
@Aravind:好的,这不是C#,而是WPF。但文件应该告诉你一切你需要知道的。 - Jon Skeet

0
您可以订阅计时器已过事件,然后更改属性的值,从而触发通知更改事件。并在视图中将当前时间绑定到您的元素上。
    private DateTime _currentTime;
    private Timer _timer = new Timer(1000);

    public DateTime CurrentTime
    {
        get { return _currentTime; }
        set { 
        if (object.Equals(_currentTime , value)) return;
        _currentTime = value;
        PropertyChanged(this, new PropertyChangedEventArgs(_currentTime)) }
    }
    public MainWindowViewModel()
    {
        CurrentTime = DateTime.Now;
        _timer.Elapsed += (s, e) => CurrentTime = DateTime.Now.ToLocalTime();
        _timer.Start();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接