来自Software Engineering Stack Exchange的
This question was migrated,因为可以在Stack Overflow上进行回答。
Migrated 5年前。
我的目标是使
将
类似的代码已在控制台应用程序中工作,所以我不明白这里发生了什么。起作用的控制台应用程序代码片段是:
请注意,如果运行此代码,则直到分配的时间跨度都不会发生。这是因为WPF直到退出循环后才能更新UI。您的代码永远不会超出循环范围,因此永远无法更新UI。签出具有属性绑定的MVVM模式。在这种情况下,带有数据绑定的INotifyPropertyChange将使生活更轻松...但是,您可能仍然希望有一些方法可以打破循环:)
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/