【问题标题】:Windows Store App MetronomeWindows 应用商店应用节拍器
【发布时间】:2023-03-30 06:33:01
【问题描述】:

我正在开发 Windows 应用商店应用程序。我需要实现一个节拍器。这个节拍器应该有 bpm 设置。用户应该能够增加/减少它。

到目前为止,这是我的代码:

namespace App1
{

    public sealed partial class MainPage : Page
    {
        public class TickArgs : EventArgs
        {
            public DateTime Time { get; set; }
        }


        public class Metronome
        {
            public event TickHandler Tick = (m, e) => { };
            public delegate void TickHandler(Metronome m, TickArgs e);
            public void Start()
            {
                while (true)
                {
                    System.Threading.Tasks.Task.Delay(3000);
                    Tick(this, new TickArgs { Time = DateTime.Now });
                }
            }
        }

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


        public MainPage()
        {
            this.InitializeComponent();
        }


        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Metronome m = new Metronome();
            Listener l = new Listener();
            l.Subscribe(m, tbcheck, mediaElement1);
            m.Start();
        }
    }
}

如何修改此代码以进行 BPM 设置?

我的问候

【问题讨论】:

    标签: c# windows-store-apps


    【解决方案1】:

    而不是 uisng Task.Delay,使用 Timer 可能更容易

    您可以将BBM 传递给Start 方法并根据该方法设置间隔

        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, EventArgs 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();
            }
        }
    
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Metronome m = new Metronome();
            Listener l = new Listener();
            l.Subscribe(m, tbcheck, mediaElement1);
            m.Start(8); // 8bbm
        }
    

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2012-10-01
      相关资源
      最近更新 更多