WPF TextBlock实时刷新

本文关键字:刷新 实时 TextBlock WPF | 更新日期: 2023-09-27 18:05:10

我的目标是让TextBlock.Text值不断刷新。

当我将while(true)添加到代码中时,当我启动应用程序时没有显示窗口。

using System;
using System.Windows;
namespace daysAliveWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DateTime myBirthday = new DateTime(1984, 01, 01);
            while (true)
            {
                TimeSpan daysAlive = DateTime.Now.Subtract(myBirthday);
                MyTextBlock.Text = daysAlive.TotalDays.ToString();
            }
        }
    }
}

类似的代码在控制台应用程序中工作,所以我不明白这里发生了什么。控制台应用程序的代码片段是:

using System;
namespace DisplayRealTime
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime myBirthday = new DateTime(1984, 01, 01);
            while (true)
            {
                TimeSpan daysAlive = DateTime.Now.Subtract(myBirthday);
                Console.Write("'rTotal Days Alive: {0}"
                    , daysAlive.TotalDays.ToString(".#####"));
            }
        }
    }
}

WPF TextBlock实时刷新

这是线程问题。你的循环阻碍了UI的更新。

namespace ThrowAway
{
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DoCrazyLoop();
    }
    public void DoCrazyLoop()
    {
        DateTime myBirthday = new DateTime(1984, 01, 19);
        bool breakLoop = false;
        Timer t = new Timer(o =>
        {
            breakLoop = true;
        }, null, 10000, 100);
        while (breakLoop == false)
        {
            TimeSpan daysAlive = DateTime.Now.Subtract(myBirthday);
            MyTextBlock.Text = daysAlive.TotalDays.ToString();
        }
    }
 }
}

注意,如果运行这段代码,在分配的时间跨度过去之前不会发生任何事情。这是因为WPF在脱离循环之前无法更新UI。你的代码永远不会跳出循环,所以永远无法更新UI。查看带有属性绑定的MVVM模式。INotifyPropertyChange与数据绑定将使生活在这个例子中更容易…但是,您可能仍然希望以某种方式跳出循环:)