WPF TextBlock实时刷新

时间:2014-05-26 22:32:45

标签: c# wpf

我的目标是让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(".#####"));
            }

        }
    }
}

1 个答案:

答案 0 :(得分:2)

这是一个线程问题。您的循环阻止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将在这个实例中使生活更轻松......但是,你可能仍然想要一些方法来打破你的循环:)