【问题标题】:Windows Store Application Metronome Stop Button Not WorkingWindows Store 应用程序节拍器停止按钮不起作用
【发布时间】:2013-09-05 03:04:01
【问题描述】:

您好,我正在开发 Windows 应用商店应用程序。

首先,这是我的代码:

public class TickArgs : EventArgs
{
    public DateTime Time { get; set; }
}

public class Metronome
{
    private DispatcherTimer _timer;
    public event TickHandler Tick;
    public delegate void TickHandler(Metronome m, TickArgs e);

    public Metronome()
    {
        _timer = new DispatcherTimer();
        _timer.Tick += Timer_Tick;
    }

    private void Timer_Tick(object sender, object e)
    {
        if (Tick != null)
        {
            Tick(this, new TickArgs { Time = DateTime.Now });
        }
    }

    public void Start(int bbm)
    {
        _timer.Stop();
        _timer.Interval = TimeSpan.FromSeconds(60 / bbm);
        _timer.Start();
    }
    public void Stop()
    {
        _timer.Stop();
        _timer.Start();
    }
}

public class Listener
{
    public void Subscribe(Metronome m, MediaElement mmx)
    {
        m.Tick += (mm, e) => mmx.Play();
    }
    public void UnSubscribe(Metronome m, MediaElement mmx)
    {
        m.Tick += (mm, e) => mmx.Stop(); 
    }
}

要启动节拍器,我使用以下代码:

l.Subscribe(m, mediaelement);
m.Start(120);

这很好用。

要停止节拍器,我使用以下代码:

l.UnSubscribe(m, mediaelement);
m.Stop();

节拍器停止但是如果我尝试重新开始,它只是不启动。我该怎么办?

感谢您的帮助。

我的问候...

【问题讨论】:

  • 为什么Stop()方法中停止定时器后立即启动定时器?
  • 此外,您的订阅和取消订阅似乎总是在添加处理程序,而从不删除它们。这是故意的吗?你可能想研究一下 WeakEventHandler 之类的东西。
  • @NateDiamond 您好,感谢您的回答。但是,如果我在停止计时器后不启动计时器,则声音文件不会停止播放。关于订阅和取消订阅,不是有意的。可能是因为这个错误,我应该怎么做才能修复它?我真的想不通。

标签: c# windows-store-apps


【解决方案1】:

好的,您所做的就是为您的节拍器订阅了两个处理程序,每个处理程序都发生在滴答计时器上。

首先,在您的Listener 类中创建一个静态方法作为您可以删除的事件处理程序。

private static void TickPlay(object sender, EventArgs e)
{
    mmx.Play();
}

然后,在您的 Subscribe 方法中,只需说:

m.Tick += TickPlay;

最后,对于你的 Unsubscribe 方法,说:

m.Tick -= TickPlay;

这样它就不会一直播放/停止滴答间隔。

【讨论】:

  • 发生了什么?不是又开始了吗?不是在建吗?
  • 它无法识别 mmx,但我已修复它。当它开始工作时,它就不会停止。什么都没有发生 :(
【解决方案2】:

我找到了解决办法。

我刚刚对启动和停止方法做了一些小改动:

public void Start(int bbm)
{
    _timer.Interval = new TimeSpan(0, 0, 0, 0, 500);
    _timer.Start();
}
public void Stop()
{
    _timer.Stop();
}

现在它工作得很好。

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多