我的目标是让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(".#####"));
}
}
}
}
答案 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将在这个实例中使生活更轻松......但是,你可能仍然想要一些方法来打破你的循环:)