来自Software Engineering Stack Exchange的

This question was migrated,因为可以在Stack Overflow上进行回答。
                            Migrated 5年前。
                        
                    
                
                            
                    
我的目标是使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(".#####"));
            }

        }
    }
}

最佳答案

这是一个线程问题。您的循环阻止了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将使生活更轻松...但是,您可能仍然希望有一些方法可以打破循环:)

关于c# - WPF TextBlock实时刷新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23919187/

10-09 20:00
查看更多