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内容更新秒而不单击按钮?

c# WPF -如何在运行后自动刷新UI

修改代码后,答案完全改变了。我为内容的巨大变化道歉。完成此任务的"最简单"方法是为计数器更新添加一个事件,并让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