c# WPF -如何在运行后自动刷新UI
本文关键字:刷新 UI 运行 WPF | 更新日期: 2023-09-27 18:08:36
我在XAML中创建了一个简单的Label
,名为TbTimer
我编写了以下代码:
class Level2
{
public Level2()
{
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer_Tick;
}
public int counter;
public void timer_Tick(object sender, EventArgs e)
{
counter++;
}
public DispatcherTimer timer;
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
lvl2 = new Level2();
}
private void MenuItemMedium_Click(object sender, RoutedEventArgs e)
{
lvl2.timer.Start();
TbTimer.Content = lvl2.counter.ToString();
}
}
然后我有另一个按钮,当按钮被点击时,我调用TimerUpdater
。
当我运行程序并点击按钮时,我可以看到TextBlock
的内容显示数字1…并且它不会继续运行数字-当我在5秒后再次点击按钮时,它显示数字6。
所以我猜定时器在幕后运行良好,但TextBlock
的内容只有在我点击按钮时才更新。
我该怎么做才能使TextBlock
内容更新秒而不单击按钮?
修改代码后,答案完全改变了。我为内容的巨大变化道歉。完成此任务的"最简单"方法是为计数器更新添加一个事件,并让UI订阅它。比如:
class Level2
{
public event Action<int> CounterUpdated;
...
public void timer_Tick(object sender, EventArgs e)
{
counter++;
if (CounterUpdated != null)
CounterUpdated(counter);
}
}
public class MainWindow
{
public MainWindow()
{
InitializeComponent();
lvl2 = new Level2();
lvl2.CounterUpdated += UpdateCounterText;
}
private void MenuItemMedium_Click(object sender, RoutedEventArgs e)
{
lvl2.timer.Start();
}
private void UpdateCounterText(int newCounterValue)
{
TbTimer.Content = newCounterValue.ToString();
}
}
顺便提一下,这最终与绑定系统的设置方式相似。如果您只是将文本框绑定到counter
变量,那么它将更干净,更易于使用。为此,您需要将XAML更改为:
<TextBox Name="TbTimer" Text="{Binding Counter}"/>
并赋值DataContext:
public class MainWindow
{
public MainWindow()
{
InitializeComponent();
lvl2 = new Level2();
DataContext = lvl2;
}
private void MenuItemMedium_Click(object sender, RoutedEventArgs e)
{
lvl2.timer.Start();
}
}
Level2
现在需要实现INotifyPropertyChanged,并且您必须使counter成为属性(因此可以绑定到):
class Level2 : INotifyPropertyChanged
{
//Notify Property Changed Implementation from MSDN:
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private int counter = 0;
public int Counter
{
get { return counter; }
set
{
counter = value;
NotifyPropertyChanged();
}
}
...
public void timer_Tick(object sender, EventArgs e)
{
Counter++;
}
}
绑定系统现在将在计时器滴答时自动更新文本框(并增加Counter
属性)。这就是WPF中应该采用的方式,所以在实现它时,请随意提出任何问题。
作为参考,这是我使用的INofityPropertyChanged
的实现:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx