Windows应用商店应用程序节拍器停止按钮不起作用

时间:2013-09-03 19:31:41

标签: c# windows-store-apps

您好我正在开发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();

节拍器停止但是如果我再次尝试重新启动,它就不会启动。我该怎么办?

感谢您的帮助。

我的问候......

2 个答案:

答案 0 :(得分:1)

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

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

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

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

m.Tick += TickPlay;

最后,对于您的Unsubscribe方法,请说:

m.Tick -= TickPlay;

这样它就不会继续播放/停止音阶间隔。

答案 1 :(得分:0)

我找到了解决方案。

我刚刚开始和停止方法做了一些小改动:

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

现在它完美无缺。

此致