我正在尝试构建自己的节拍器UWP应用程序,这是我迄今为止所做的:
我设计了一个Class,它将使用DispatcherTimer处理我的应用程序的所有所需操作
...
public MetronomeContructor(int upperNum, int lowerNum, int bpm, System.Uri baseURI, MainPage page, MediaElement mediaTick, MediaElement mediaTock)
{
UpperNum = upperNum;
LowerNum = lowerNum;
Bpm = bpm;
BaseURI = baseURI;
CalculateBpm(Bpm);
Page = page;
Tick = mediaTick;
Tock = mediaTock;
DispTimer = new DispatcherTimer();
DispTimer.Tick += new EventHandler<object>(timer_Tick);
Tick.AutoPlay = false;
Tock.AutoPlay = false;
Tick.Source = new Uri(Page.BaseUri, Page.Sounds.Where(X => X.Name == "Tick").FirstOrDefault().AudioFile.ToString());
Tock.Source = new Uri(Page.BaseUri, Page.Sounds.Where(X => X.Name == "Click").FirstOrDefault().AudioFile.ToString());
StartInterval();
}
//*************************************************************
//Methods
public void CalculateBpm(int bpms)
{
this.TimerMSecs = (1000 * 60) / bpms;
}
//*********************************
//Dispatcher Methods and Events
public void StartInterval()
{
DispTimer.Interval = TimeSpan.FromMilliseconds(TimerMSecs);
}
async void timer_Tick(object sender, object e)
{
await Page.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
{
Tick.Play();
});
}
我的主页看起来像这样:
public sealed partial class MainPage : Page
{
public ObservableCollection<Sound> Sounds;
private MetronomeContructor novo;
public MainPage()
{
this.InitializeComponent();
Sounds = new ObservableCollection<Sound>();
SoundManager.GetAllSounds(Sounds);
novo = new MetronomeContructor(4, 4, 120, this.BaseUri, this, MediaElemTick, MediaElemTock);
}
private void sliderBpm_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (novo != null)
{
novo.Bpm = (int)sliderBpm.Value;
novo.CalculateBpm(novo.Bpm);
DisplayTxtBlock.Text = novo.Bpm.ToString();
novo.StartInterval();
}
}
private void StartButton_Click(object sender, RoutedEventArgs e)
{
if (novo!=null)
{
novo.DispTimer.Start();
}
}
private void StopButton_Click(object sender, RoutedEventArgs e)
{
if (novo != null)
{
novo.DispTimer.Stop();
}
}
我还在开始实现这项功能,但作为一名音乐家,我意识到调度程序在给定的TimeSpan上没有有效运行,所以我试图让它成为异步操作。虽然不准确。
我用Dispatcher读到这一点,我们肯定不会在TimeSpan之前运行,但是有可能它可以在没有控制权的TimeSpan之后运行。 我的问题是这个设计问题?有没有人知道UWP中有效的定时器? 如何实施一个有效的简单节拍器呢?
注意事项:我正在使用VisualStudio 2015构建UWP Windows 10应用程序我是一个喜欢在我的空闲时间编写代码的音乐家,任何设计或代码改进的理念都很好。英语也不是我的母语。 TY