来自类的WPF访问标签

时间:2014-05-26 22:15:50

标签: c# wpf xaml

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。 然后我有一个带有2个标签的页面,1个小时(小时1)和1个小时(分钟1)。

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

1 个答案:

答案 0 :(得分:0)

看起来您的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事件。

希望这有帮助。