【问题标题】:How do I navigate to a new page in windows 8 metro apps after the sound is finished playing?声音播放完毕后,如何在 Windows 8 Metro 应用程序中导航到新页面?
【发布时间】:2013-02-11 06:13:12
【问题描述】:

我正在使用以下代码在按钮单击时播放声音。

public class AudioHelper
    {
        public async static void playButtonClick()
        {
            MediaElement snd = new MediaElement();
            StorageFolder folder = await Package.Current.InstalledLocation.GetFolderAsync("Audios");
            StorageFile file = await folder.GetFileAsync("buttonClick.m4a");
            var stream = await file.OpenAsync(FileAccessMode.Read);
            snd.SetSource(stream, file.ContentType);
            snd.Play();
        }
    }

我使用以下代码从按钮单击事件中调用代码:

 private void btnFlashCard_Click(object sender, RoutedEventArgs e)
        {
            AudioHelper.playButtonClick();
            this.Frame.Navigate(typeof(LevelSelection));
        }

由于 playButtonClick 是异步的,因此页面会在音频开始播放之前导航到 LevelSelection 页面。如何使音频先播放然后页面导航?谢谢。

编辑: 感谢@htcdmrl,我能够弄清楚如何做到这一点。正如我在评论中提到的,为了触发 MediaEnded 事件,MediaElement 必须位于可视树中。我在 xaml 中添加了以下代码并稍微修改了代码以使其正常工作。

我在 XAML 中添加了以下代码:

 <Frame HorizontalAlignment="Left" Margin="10,742,0,0" VerticalAlignment="Top">
            <MediaElement x:Name="me"  HorizontalAlignment="Left" Height="100" Margin="20,742,0,-74" VerticalAlignment="Top" Width="100" RenderTransformOrigin="0.359,-0.219"/>
        </Frame>

在 MainPage.Xaml.cs 中添加以下代码

public MainPage()
        {
            this.InitializeComponent();
            me.MediaEnded += me_MediaEnded;
        }

        void me_MediaEnded(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(LevelSelection));
        }

并将 playButtonclick 和 btnFlashCard_Click 更改为以下内容:

private void btnFlashCard_Click(object sender, RoutedEventArgs e)
        {
            playButtonClick();
        }

        public async void playButtonClick()
        {


            StorageFolder folder = await Package.Current.InstalledLocation.GetFolderAsync("Audios");
            StorageFile file = await folder.GetFileAsync("buttonClick.m4a");
            var stream = await file.OpenAsync(FileAccessMode.Read);
            me.SetSource(stream, file.ContentType);

            me.Play();
        }

【问题讨论】:

    标签: c# windows-8 navigation mediaelement


    【解决方案1】:

    将媒体结束事件添加到您的媒体元素;

    MediaElement snd = new MediaElement();
    snd.MediaEnded += snd_MediaEnded;
    

    然后添加您的活动;

    void snd_MediaEnded(object sender, RoutedEventArgs e)
    {
        snd.Stop();
        this.Frame.Navigate(typeof(LevelSelection));
    }
    

    【讨论】:

    • 我添加了如上所示的 MediaEnded 事件,但 MediaEnded 事件从未触发。有什么想法吗?
    • 我知道出了什么问题。事实证明,为了触发事件,MediaEnded 必须位于可视树中。为了让我能够做到这一点,我必须在 xaml 中添加带有 mediaelement 的框架。
    【解决方案2】:

    使用事件 MediaElement.MediaEnded 事件:

    private void btnFlashCard_MediaEnded(object sender, EventArgs e)
    {
       this.Frame.Navigate(typeof(LevelSelection));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多