类中的WPF访问标签

本文关键字:访问 标签 WPF | 更新日期: 2023-09-27 18:05:28

Service.cs

public class Service
{
    private Timer timer;
    private int hours;
    private int minutes;
    public Service()
    {
        timer = new Timer();
        timer.Interval = 60000;
        timer.Tick += new System.EventHandler(OnTick);
        // ...
    }
    public void StartTimer() { /* ... */ }
    public void PauseTimer() { /* ... */ }
    private void OnTick(object sender, EventArgs e)
    {
        if (minutes == 59) {
            minutes = 0;
            hours += 1;
        } else {
            minutes += 1;
        }
        //...
        // NOW I WANT TO SET THE CONTENT OF servicePage.hoursl AND servicePage.minutesl
        // ACCORDING TO THE VALUES I GET ON this.hours AND this.minutes
    }

servicePage.xaml

<Label x:Name="hoursl" Grid.Row="1" Grid.Column="0" FontSize="24" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Label x:Name="minutesl" Grid.Row="1" Grid.Column="2" FontSize="24" VerticalAlignment="Center" HorizontalAlignment="Center"/>

servicePage.xaml.cs

public partial class servicePage : Page { /* ... */ }

我有一个名为Service的类,其中我需要为Service的每个实例都有一个Timer。然后我有一个有两个标签的页面,一个表示小时,一个代表分钟。

有没有办法从函数OnTick((上的servicePage访问标签?并将这些标签的内容设置为计时器提供的小时和分钟值?

类中的WPF访问标签

看起来您的ServicePage需要订阅Service类发布的事件。这样它就会知道计时器何时滴答作响。

然后可以适当地更新这两个标签。

如果使用MVVM,您的视图模型将订阅事件,并通过绑定更新视图中的标签。

下面是一个简单的非MVVM示例:

public class Service
{
    public delegate void TimerTickHandler(int hours, int minutes);
    public event TimerTickHandler TimerTick;
    .
    .
    .
    private void OnTick(object sender, EventArgs e)
    {
      ...
      if (TimerTick != null)
           TimerTick(hours, minutes);

    }
}

现在,您的ServicePage类将需要该Service类的一个实例并订阅该事件。如果您选择MVVM路线,也可以采用类似的方法。

如果您的Service类仅在Application_Startup上实例化,如果有意义的话,您可以按照singleton模式存储实例,这样其他类就可以获得该实例。只有在每个应用程序只能有一个定时器实例的情况下,这才会起作用。

辛格尔顿:https://msdn.microsoft.com/en-us/library/ff650316.aspx

一旦Service类是一个单例,ServicePage.xaml.cs就可以获得公共实例并订阅TimerTick事件。

希望这能有所帮助。