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(".#####"));
}
}
}
}
这是线程问题。你的循环阻碍了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与数据绑定将使生活在这个例子中更容易…但是,您可能仍然希望以某种方式跳出循环:)