2012-01-11 15 views
3

XMLから複数のオーディオファイルURIを解析し、MediaElementのSourceプロパティにバインドしています。オーディオファイルをトリガーする8つのボタンがあります。 AutoPlayプロパティがTrueに設定されていると、すべて正常に動作します。各ボタンは、適切なオーディオファイルをトリガーします。ただし、ページが読み込まれるとすぐにオーディオの再生が開始されないようにするため、自動再生を偽に設定しています。今は何も動かない。ページはロードされますが、ボタンはオーディオファイルをトリガーしません。どうすればこのバグを解決できますか?MediaElement AutoPlay = "False"バグ

コード:

public partial class MainPage : PhoneApplicationPage 
{ 
    string name = "C"; 

    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     SetPlayerSource(); 
     base.OnNavigatedTo(e); 
    } 

    private void SetPlayerSource() 
    { 
     XDocument audioPlayer = XDocument.Load("Audio.xml"); 

     var aani = (from audio in audioPlayer.Descendants("Note") 
        where audio.Attribute("id").Value == name 
        select new AudioClass 
        { 
         Audio = (string)audio.Element("url").Value 

        }).SingleOrDefault(); 

     player.Source = new Uri(aani.Audio, UriKind.RelativeOrAbsolute); 
    } 


    private void C_Key_Click(object sender, RoutedEventArgs e) 
    { 
     var buttonName = (sender as Button).Name; 
     var underscorePos = buttonName.IndexOf('_'); 
     name = buttonName.Substring(0, underscorePos); 
     SetPlayerSource(); 
     player.Play(); 

    } 

    private void D_Key_Click(object sender, RoutedEventArgs e) 
    { 
     var buttonName = (sender as Button).Name; 
     var underscorePos = buttonName.IndexOf('_'); 
     name = buttonName.Substring(0, underscorePos); 
     SetPlayerSource(); 
     player.Play(); 
    } 

XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="41,-8,-17,8"> 
     <Button x:Name="C_key" Content="" HorizontalAlignment="Left" Height="220" Margin="8,0,0,8" Style="{StaticResource C}" VerticalAlignment="Bottom" Width="75" Click="C_Key_Click"/> 
     <Button x:Name="D_key" Content="" HorizontalAlignment="Left" Height="220" Margin="87,0,0,8" Style="{StaticResource D}" VerticalAlignment="Bottom" Width="75" Click="D_Key_Click"/> 
     <Button x:Name="E_key" Content="" HorizontalAlignment="Left" Height="220" Margin="166,0,0,8" Style="{StaticResource E}" VerticalAlignment="Bottom" Width="75" Click="E_Key_Click"/> 
     <Button x:Name="F_key" Content="" HorizontalAlignment="Left" Height="220" Margin="245,0,0,8" Style="{StaticResource F}" VerticalAlignment="Bottom" Width="75" d:LayoutOverrides="Width" Click="F_Key_Click"/> 
     <Button x:Name="G_key" Content="" Height="220" Margin="324,0,305,8" Style="{StaticResource G}" VerticalAlignment="Bottom" Click="G_Key_Click"/> 
     <Button x:Name="A_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,226,8" Style="{StaticResource A}" VerticalAlignment="Bottom" Width="75" Click="A_Key_Click"/> 
     <Button x:Name="B_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,147,8" Style="{StaticResource B}" VerticalAlignment="Bottom" Width="75" Click="B_Key_Click"/> 
     <Button x:Name="C2_key" Content="" HorizontalAlignment="Right" Height="220" Margin="0,0,68,8" Style="{StaticResource C2}" VerticalAlignment="Bottom" Width="75" Click="C2_Key_Click"/> 
     <MediaElement Height="120" HorizontalAlignment="Left" Margin="8,6,0,0" Name="player" VerticalAlignment="Top" Width="160" Source="{Binding Audio}" Volume="1" AutoPlay="False"/> 
    </Grid> 

答えて

6

あなたがSourceプロパティを設定AutoPlayfalseに設定する必要がありますMSDNによります。

SourceSetPlayerSourceに設定すると、XAMLからセッターを削除できます。それ以外はコードはよく見えます。

しかし、のコールの後にPlayと電話をかけていることがわかりました。これは、メディアを再生しようとする前に実際にメディアをロードするコード時間を与えていないでしょう。

MediaOpenedイベントでPlayに電話する必要があります。

+0

ありがとうございました!私はAutoPlay = "false"をSourceプロパティの前に置こうとしましたが、同じ結果が得られます。それだけで再生されません。空のサウンドファイルメソッドを試してみます。 –

+0

@AllanHaapalainen - XAMLのプロパティの順序は違いはありません。私はXAML全体から 'Source'の設定を取り除くことを意味しました。しかし、私はちょうど正しいかもしれない他の答えを見ました。 – ChrisF

+0

私はそれをXAMLから削除しました。私は、コード内にSourceの前にAutoPlayを設定しようとしていました。 –

3

まず、MediaElementName=playerx:Name=playerに置き換えます。そのため、他のコントロールに問題が生じることがありました。

これが機能しない場合は、オーディオのロードが完了する前にPlayメソッドを呼び出そうとしている可能性があります。代わりに、MediaOpenedイベントを処理し、そこでファイルを再生してみてください。

private void player_MediaOpened(object sender, RoutedEventArgs e) 
{ 
    player.Play(); 
} 
+0

返信いただきありがとうございます!私は上記の両方の方法を試みました。これで、ページが読み込まれるとすぐにファイルが再生されます。ボタンでオーディオファイルをトリガーします。どのようにしてそれをするのですか? –

+0

@AllanHaapalainen - 最初に再生した後、ボタンが正しくトリガーされますか? – keyboardP

+0

はい彼らは正しいファイルをトリガーします –

関連する問題