2017-09-26 66 views
0

我剛開始構建節拍器應用程序,但我在計時器刻度上播放示例聲音時遇到了麻煩。我設置計時器刻度,例如調用每1秒播放一次聲音的方法。然後它出現了一個問題,即聲音只播放一次,沒有更多。WPF播放聲音定時器刻度 - 不重複聲音

所以,我的問題 - 如何做到這一點在每個計時器滴答聲播放聲音?

<Window x:Class="Metronome.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <StackPanel Grid.Column="0"> 
     <TextBox Name="textBox1" /> 
     <Button Name="button1" Content="Start" Click="button1_Click" /> 
     <MediaElement Name="mediaElement1" Source="MetroBar1.wav" LoadedBehavior="Manual" /> 
    </StackPanel> 
</Grid> 

 using System.Collections.Generic; 
     using System.Linq; 
     using System.Text; 
     using System.Windows; 
     using System.Windows.Controls; 
     using System.Windows.Data; 
     using System.Windows.Documents; 
     using System.Windows.Input; 
     using System.Windows.Media; 
     using System.Windows.Media.Imaging; 
     using System.Windows.Navigation; 
     using System.Windows.Shapes; 
     using System.Windows.Threading; 

     namespace Metronome 
{ 
public partial class MainWindow : Window 
{ 
    const int secInMin = 60; 
    int beatRate; 
    double beatPerMsec; 

    DispatcherTimer timer1; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     timer1 = new DispatcherTimer(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     //beatRate = Convert.ToInt16(textBox1.Text); 
     //beatPerMsec = Math.Pow((beatRate/secInMin), -1) * 1000; //Amount of beats (timer ticks) per msec 
     // timer1.Tick += new EventHandler(metronome_Run); 
     timer1.Tick += metronome_Run; 
     //timer1.Interval = new TimeSpan(0, 0, 0, 0, Convert.ToInt16(beatPerMsec)); 
     timer1.Interval = new TimeSpan(0, 0, 1); 
     timer1.Start(); 
    } 

    private void metronome_Run(object sender, EventArgs e) 
    { 
     mediaElement1.Play(); 
    } 
} 

}

+1

爲什麼要寫Math.Pow(a/b,-1)而不是b/a? :) – Adassko

回答

4

從MSDN:

MediaElement.Play()

從當前位置播放媒體。

MediaElement在完成播放後不會自動重置其位置。在致電Play之前,您需要手動重置Position

private void metronome_Run(object sender, EventArgs e) 
{ 
    mediaElement1.Position = new TimeSpan(0); 
    mediaElement1.Play(); 
} 

這可能是更安全的主叫Play,這取決於你的聲音文件的長度之前調用StopStop將自動重置回開始,並中斷任何當前正在播放的聲音。

private void metronome_Run(object sender, EventArgs e) 
{ 
    mediaElement1.Stop(); 
    mediaElement1.Play(); 
} 
+0

謝謝,是秒的方式似乎更好,因爲當我使用mediaElement.Position時,我可以聽到節拍不穩定。 –