×
Namespaces

Variants
Actions

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

From Nokia Developer 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 09:30.
125 page views in the last 30 days.
×