Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

在游戏中播放mp3格式的背景音乐

From Wiki
Jump to: navigation, search
WP Metro Icon Joystick.png
WP Metro Icon Multimedia.png
Article Metadata

代码示例
文章
Xinx Gong 在 17 Jun 2013 创建
最后由 hamishwillee 在 03 Jul 2013 编辑

Contents

介绍

Windows Phone中对于声音播放,最常用的有两种方式,MediaElement和SoundEffect。一般来说,MediaElement更倾向于音乐的播放,而SoundEffect更倾向于游戏中声音的播放。但是SoundEffect有个致命的弱点,只支持wav文件,不支持mp3文件,但是相同的音频文件,wav格式所占的空间是要大于mp3格式,对于游戏中简单的短短几秒或不到1秒音效来说,差别可能不大,但是对于长达几十秒甚至几分钟的背景音乐来说,这个差别是不能接受的,所以就有了这篇文章——《在游戏中播放mp3格式的背景音乐》

既然要播放的是mp3文件,所使用的也当然是MediaElement控件,但是MediaElement既然是一个控件,那么它就一定要放在一个页面中才能发出声音,然而我们既然要作为背景音乐,当然就不能受到页面切换的影响,所以这个控件必须是全局的。

添加全局MediaElement控件

要创建全局的控件,不能在某一页面入手,必须先找到应用的框架——App.RootFrame。

/// <summary>
///提供对电话应用程序的根框架的轻松访问。
/// </summary>
/// <returns>电话应用程序的根框架。</returns>
public PhoneApplicationFrame RootFrame { get; private set; }

PhoneApplicationFrame其实也是控件类型,我们同样可以来修改它的Style。

如果你想自行修改它的Style,你可以先在MainPage.xaml文件中手动添加该控件:

<phone:PhoneApplicationFrame/>

然后创建它的Style副本,并保存到App.xaml中。 或者你可以直接把下面的代码拷贝到App.xaml文件中的< Application.Resources >节点里。

<Style x:Key="GlobalPhoneApplicationFrameStyle" TargetType="phone:PhoneApplicationFrame">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
<Setter Property="FontSize" Value="{StaticResource PhoneFontSizeNormal}"/>
<Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="{x:Null}"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="phone:PhoneApplicationFrame">
<Grid>
<Border x:Name="ClientArea" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}">
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<MediaElement Loaded="Media_Loaded" AutoPlay="True" Source="/sound.mp3"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

上面的代码就是在不破坏原本框架的基础上,增加了一个MediaElement控件,控件的一些属性如AutoPlay、Source等可以根据项目需要来设定。

<MediaElement Loaded="Media_Loaded"/>

为了能找到该MediaElement控件,以便在项目中使用,我们实现了控件的Loaded方法,另外在App.xaml.cs中声明一个全局对象,如下:

/// <summary>
/// 全局MediaElement控件,用于播放背景音乐
/// </summary>
public static MediaElement GlobalMedia;
 
private void Media_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
if (GlobalMedia == null)
{
GlobalMedia = sender as MediaElement;
}
}

生成好了我们需要的PhoneApplicationFrame Style,下一步就是使用它,这一步骤很简单,只需要在App的构造函数中,初始化RootFrame完成后设置一下就可以了。

/// <summary>
/// Application 对象的构造函数。
/// </summary>
public App()
{
...
// 特定于电话的初始化
InitializePhoneApplication();
RootFrame.Style = Resources["GlobalPhoneApplicationFrameStyle"] as Style;
...
}

使用时注意事项

由于App.GlobalMedia是在MediaElement的Loaded事件中才被赋值,所以在应用的第一个页面中的OnNavigatedTo事件中还没有初始化完成,需要在页面的Loaded事件中才可以使用。

源码下载

File:GlobalMediaExample.zip

This page was last modified on 3 July 2013, at 06:30.
99 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×