一:运行预览

二:解决方案截图

三:主要代码
程序入口:App.xaml
using System;
using System.Diagnostics;
using System.Resources;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using 声音库.Resources;
using 声音库.ViewModels;
namespace 声音库
{
public partial class App : Application//程序的入口
{
//粗体为主要自写代码
private static SoundModel viewModel = null;//软件整个的模板
public static SoundModel ViewModel//属性:如果模板为空加载数据
{
get
{
if (viewModel == null)
{
viewModel = new SoundModel();
viewModel.LoadData();
}
return viewModel;
}
}
/// <summary>
/// 提供对电话应用程序的根框架的轻松访问。
/// </summary>
/// <returns>电话应用程序的根框架。</returns>
public static PhoneApplicationFrame RootFrame { get; private set; }
/// <summary>
/// Application 对象的构造函数。
/// </summary>
public App()
{
// 未捕获的异常的全局处理程序。
UnhandledException += Application_UnhandledException;
// 标准 XAML 初始化
InitializeComponent();
// 特定于电话的初始化
InitializePhoneApplication();
// 语言显示初始化
InitializeLanguage();
// 调试时显示图形分析信息。
if (Debugger.IsAttached)
{
// 显示当前帧速率计数器
Application.Current.Host.Settings.EnableFrameRateCounter = true;
// 显示在每个帧中重绘的应用程序区域。
//Application.Current.Host.Settings.EnableRedrawRegions = true;
// 启用非生产分析可视化模式,
// 该模式显示递交给 GPU 的包含彩色重叠区的页面区域。
//Application.Current.Host.Settings.EnableCacheVisualization = true;
// 通过禁用以下对象阻止在调试过程中关闭屏幕
// 应用程序的空闲检测。
// 注意: 仅在调试模式下使用此设置。禁用用户空闲检测的应用程序在用户不使用电话时将继续运行
// 并且消耗电池电量。
PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
}
}
// 应用程序启动(例如,从“开始”菜单启动)时执行的代码
// 此代码在重新激活应用程序时不执行
private void Application_Launching(object sender, LaunchingEventArgs e)
{
}
// 激活应用程序(置于前台)时执行的代码
// 此代码在首次启动应用程序时不执行
private void Application_Activated(object sender, ActivatedEventArgs e)
{
// 确保正确恢复应用程序状态
if (!App.ViewModel.IsDataLoaded)
{
App.ViewModel.LoadData();
}
}
// 停用应用程序(发送到后台)时执行的代码
// 此代码在应用程序关闭时不执行
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
}
// 应用程序关闭(例如,用户点击“后退”)时执行的代码
// 此代码在停用应用程序时不执行
private void Application_Closing(object sender, ClosingEventArgs e)
{
// 确保所需的应用程序状态在此处保持不变。
}
// 导航失败时执行的代码
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (Debugger.IsAttached)
{
// 导航已失败;强行进入调试器
Debugger.Break();
}
}
// 出现未处理的异常时执行的代码
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (Debugger.IsAttached)
{
// 出现未处理的异常;强行进入调试器
Debugger.Break();
}
}
#region 电话应用程序初始化
// 避免双重初始化
private bool phoneApplicationInitialized = false;
// 请勿向此方法中添加任何其他代码
private void InitializePhoneApplication()
{
if (phoneApplicationInitialized)
return;
// 创建框架但先不将它设置为 RootVisual;这允许初始
// 屏幕保持活动状态,直到准备呈现应用程序时。
RootFrame = new PhoneApplicationFrame();
RootFrame.Navigated += CompleteInitializePhoneApplication;
// 处理导航故障
RootFrame.NavigationFailed += RootFrame_NavigationFailed;
// 在下一次导航中处理清除 BackStack 的重置请求,
RootFrame.Navigated += CheckForResetNavigation;
// 确保我们未再次初始化
phoneApplicationInitialized = true;
}
// 请勿向此方法中添加任何其他代码
private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
{
// 设置根视觉效果以允许应用程序呈现
if (RootVisual != RootFrame)
RootVisual = RootFrame;
// 删除此处理程序,因为不再需要它
RootFrame.Navigated -= CompleteInitializePhoneApplication;
}
private void CheckForResetNavigation(object sender, NavigationEventArgs e)
{
// 如果应用程序收到“重置”导航,则需要进行检查
// 以确定是否应重置页面堆栈
if (e.NavigationMode == NavigationMode.Reset)
RootFrame.Navigated += ClearBackStackAfterReset;
}
private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)
{
// 取消注册事件,以便不再调用该事件
RootFrame.Navigated -= ClearBackStackAfterReset;
// 只为“新建”(向前)和“刷新”导航清除堆栈
if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh)
return;
// 为了获得 UI 一致性,请清除整个页面堆栈
while (RootFrame.RemoveBackEntry() != null)
{
; // 不执行任何操作
}
}
#endregion
// 初始化应用程序在其本地化资源字符串中定义的字体和排列方向。
//
// 若要确保应用程序的字体与受支持的语言相符,并确保
// 这些语言的 FlowDirection 都采用其传统方向,ResourceLanguage
// 应该初始化每个 resx 文件中的 ResourceFlowDirection,以便将这些值与以下对象匹配
// 文件的区域性。例如:
//
// AppResources.es-ES.resx
// ResourceLanguage 的值应为“es-ES”
// ResourceFlowDirection 的值应为“LeftToRight”
//
// AppResources.ar-SA.resx
// ResourceLanguage 的值应为“ar-SA”
// ResourceFlowDirection 的值应为“RightToLeft”
//
// 有关本地化 Windows Phone 应用程序的详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=262072。
//
private void InitializeLanguage()
{
try
{
// 将字体设置为与由以下对象定义的显示语言匹配
// 每种受支持的语言的 ResourceLanguage 资源字符串。
//
// 如果显示出现以下情况,则回退到非特定语言的字体
// 手机的语言不受支持。
//
// 如果命中编译器错误,则表示以下对象中缺少 ResourceLanguage
// 资源文件。
RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage);
// 根据以下条件设置根框架下的所有元素的 FlowDirection
// 每个以下对象的 ResourceFlowDirection 资源字符串上的
// 受支持的语言。
//
// 如果命中编译器错误,则表示以下对象中缺少 ResourceFlowDirection
// 资源文件。
FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection);
RootFrame.FlowDirection = flow;
}
catch
{
// 如果此处导致了异常,则最可能的原因是
// ResourceLangauge 未正确设置为受支持的语言
// 代码或 ResourceFlowDirection 设置为 LeftToRight 以外的值
// 或 RightToLeft。
if (Debugger.IsAttached)
{
Debugger.Break();
}
throw;
}
}
}
}
界面代码MainPage.xaml
<phone:PhoneApplicationPage
x:Class="声音库.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{d:DesignData SampleData/SampleData.xaml}"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--data每一项的设置-->
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="SoundTitleDataTemplate">
<Grid Background="{StaticResource PhoneAccentBrush}"
Margin="0,0,12,12">
<Grid VerticalAlignment="Top"
HorizontalAlignment="Right"
Width="40"
Height="40"
Margin="0,6,6,0">
<Ellipse Stroke="{StaticResource PhoneForegroundBrush}"
StrokeThickness="3"></Ellipse>
<Image Source="/Assets/AppBar/play.png"></Image>
</Grid>
<StackPanel VerticalAlignment="Bottom">
<TextBlock Text="{Binding Title}" Margin="6,0,0,6"></TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<!--LayoutRoot 是包含所有页面内容的根网格-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<MediaElement Name="AudioPlayer"
Volume="1"></MediaElement>
<!--model的设置-->
<phone:Pivot Title="{Binding Path=LocalizedResources.ApplicationTitle,
Source={StaticResource LocalizedStrings}}">
<!--group的页的设置-->
<phone:PivotItem Header="{Binding Animals.Title}">
<phone:LongListSelector Margin="0,0,-12,0"
ItemsSource="{Binding Animals.Items}"
LayoutMode="Grid"
GridCellSize="150,150"
ItemTemplate="{StaticResource SoundTitleDataTemplate}"
SelectionChanged="LongListSelector_SelectionChanged">
</phone:LongListSelector>
</phone:PivotItem>
<!--group的页的设置-->
<phone:PivotItem Header="{Binding Cartoons.Title}">
<phone:LongListSelector Margin="0,0,-12,0" ItemsSource="{Binding Cartoons.Items}"
LayoutMode="Grid"
GridCellSize="150,150"
ItemTemplate="{StaticResource SoundTitleDataTemplate}"
SelectionChanged="LongListSelector_SelectionChanged">
</phone:LongListSelector>
</phone:PivotItem>
<!--group的页的设置-->
<phone:PivotItem Header="{Binding Warnings.Title}">
<phone:LongListSelector Margin="0,0,-12,0" ItemsSource="{Binding Warnings.Items}"
LayoutMode="Grid"
GridCellSize="150,150"
ItemTemplate="{StaticResource SoundTitleDataTemplate}"
SelectionChanged="LongListSelector_SelectionChanged">
</phone:LongListSelector>
</phone:PivotItem>
</phone:Pivot>
<!--group的页的设置-->
<phone:PivotItem Header="{Binding Taunts.Title}">
<phone:LongListSelector Margin="0,0,-12,0" ItemsSource="{Binding Taunts.Items}"
LayoutMode="Grid"
GridCellSize="150,150"
ItemTemplate="{StaticResource SoundTitleDataTemplate}"
SelectionChanged="LongListSelector_SelectionChanged">
</phone:LongListSelector>
</phone:PivotItem>
</Grid>
</phone:PhoneApplicationPage>
自定义的三个类:SoundModel、SoundGroup、SoundData
![]()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 声音库.ViewModels
{
public class SoundModel
{
//五个分组
public SoundGroup Animals { get; set; }
public SoundGroup Cartoons { get; set; }
public SoundGroup Warnings { get; set; }
public SoundGroup Taunts { get; set; }
public SoundGroup CustomSounds { get; set; }
//是否加载数据
public bool IsDataLoaded { get; set; }
public void LoadData()//方法:加载数据
{
Animals = CreateAnimalsGroup();
Cartoons = CreateCartoonsGroup();
Taunts = CreateTauntsGroup();
Warnings = CreateWarningsGroup();
IsDataLoaded = true;
}
//加载数据的具体方法
private SoundGroup CreateAnimalsGroup()
{
SoundGroup data = new SoundGroup();//实例化一个组
data.Title = "动物";//组名
string basePath = "assets/audio/animals/";//路径的相同部分
data.Items.Add(new SoundData//组加上项
{
Title = "小猫叫",//数据标题
FilePath = basePath + "Cat Kitten.wav"//完整音频的路径
});
data.Items.Add(new SoundData
{
Title = "老猫叫",
FilePath = basePath + "Cat Meow.wav"
});
data.Items.Add(new SoundData
{
Title = "猩猩叫",
FilePath = basePath + "Chimpanzee.wav"
});
data.Items.Add(new SoundData
{
Title = "牛",
FilePath = basePath + "Cow.wav"
});
data.Items.Add(new SoundData
{
Title = "蛐蛐叫",
FilePath = basePath + "Crickets.wav"
});
data.Items.Add(new SoundData
{
Title = "狗叫",
FilePath = basePath + "Dog.wav"
});
data.Items.Add(new SoundData
{
Title = "海豚叫",
FilePath = basePath + "Dolphin.wav"
});
data.Items.Add(new SoundData
{
Title = "鸭叫",
FilePath = basePath + "Duck.wav"
});
data.Items.Add(new SoundData
{
Title = "马跑声",
FilePath = basePath + "Horse Gallop.wav"
});
data.Items.Add(new SoundData
{
Title = "马走声",
FilePath = basePath + "Horse Walk.wav"
});
data.Items.Add(new SoundData
{
Title = "狮子叫",
FilePath = basePath + "Lion.wav"
});
data.Items.Add(new SoundData
{
Title = "猪叫",
FilePath = basePath + "Pig.wav"
});
data.Items.Add(new SoundData
{
Title = "鸡打鸣",
FilePath = basePath + "Rooster.wav"
});
data.Items.Add(new SoundData
{
Title = "羊叫",
FilePath = basePath + "Sheep.wav"
});
return data;
}
private SoundGroup CreateCartoonsGroup()
{
SoundGroup data = new SoundGroup();
data.Title = "卡通";
string basePath = "assets/audio/cartoons/";
data.Items.Add(new SoundData
{
Title = "啵嘤",
FilePath = basePath + "Boing.wav"
});
data.Items.Add(new SoundData
{
Title = "枪声",
FilePath = basePath + "Bronk.wav"
});
data.Items.Add(new SoundData
{
Title = "军号",
FilePath = basePath + "Bugle charge.wav"
});
data.Items.Add(new SoundData
{
Title = "激光器",
FilePath = basePath + "Laser.wav"
});
data.Items.Add(new SoundData
{
Title = "开溜",
FilePath = basePath + "Out Here.wav"
});
data.Items.Add(new SoundData
{
Title = "啪嗒声",
FilePath = basePath + "Splat.wav"
});
return data;
}
private SoundGroup CreateTauntsGroup()
{
SoundGroup data = new SoundGroup();
data.Title = "愚弄";
string basePath = "assets/audio/taunts/";
data.Items.Add(new SoundData
{
Title = "咯咯笑",
FilePath = basePath + "Cackle.wav"
});
data.Items.Add(new SoundData
{
Title = "滴答声",
FilePath = basePath + "Clock Ticking.wav"
});
data.Items.Add(new SoundData
{
Title = "拨号声",
FilePath = basePath + "Dial up.wav"
});
data.Items.Add(new SoundData
{
Title = "击鼓",
FilePath = basePath + "Drum roll.wav"
});
data.Items.Add(new SoundData
{
Title = "电梯音乐",
FilePath = basePath + "Elevator Music.wav"
});
data.Items.Add(new SoundData
{
Title = "大笑",
FilePath = basePath + "Laugh.wav"
});
data.Items.Add(new SoundData
{
Title = "淫笑",
FilePath = basePath + "Laugh - Evil.wav"
});
data.Items.Add(new SoundData
{
Title = "白花钱",
FilePath = basePath + "Wrong Price.wav"
});
data.Items.Add(new SoundData
{
Title = "伤感长号",
FilePath = basePath + "Sad Trombone.wav"
});
data.Items.Add(new SoundData
{
Title = "挖苦的O",
FilePath = basePath + "Sarcastic Ooo.wav"
});
data.Items.Add(new SoundData
{
Title = "叹气",
FilePath = basePath + "Sigh.wav"
});
data.Items.Add(new SoundData
{
Title = "打呼噜",
FilePath = basePath + "Snore.wav"
});
data.Items.Add(new SoundData
{
Title = "打哈欠",
FilePath = basePath + "Yawn.wav"
});
return data;
}
private SoundGroup CreateWarningsGroup()
{
SoundGroup data = new SoundGroup();
data.Title = "警告";
string basePath = "assets/audio/warnings/";
data.Items.Add(new SoundData
{
Title = "汽笛",
FilePath = basePath + "Air horn.wav"
});
data.Items.Add(new SoundData
{
Title = "空袭",
FilePath = basePath + "Air Raid.wav"
});
data.Items.Add(new SoundData
{
Title = "闹钟 - 电报",
FilePath = basePath + "Alarm Clock - Electric.wav"
});
data.Items.Add(new SoundData
{
Title = "闹钟 - 电话",
FilePath = basePath + "Alarm Clock - Bell.wav"
});
data.Items.Add(new SoundData
{
Title = "抢救",
FilePath = basePath + "Backing up.wav"
});
data.Items.Add(new SoundData
{
Title = "钟声",
FilePath = basePath + "Bell - Church.wav"
});
data.Items.Add(new SoundData
{
Title = "上课铃声",
FilePath = basePath + "Bell - School.wav"
});
data.Items.Add(new SoundData
{
Title = "电雾号",
FilePath = basePath + "Fog horn.wav"
});
data.Items.Add(new SoundData
{
Title = "打碎玻璃",
FilePath = basePath + "Glass breaking.wav"
});
data.Items.Add(new SoundData
{
Title = "错误警报",
FilePath = basePath + "Missle alert.wav"
});
data.Items.Add(new SoundData
{
Title = "急救",
FilePath = basePath + "Police - UK.wav"
});
data.Items.Add(new SoundData
{
Title = "警察",
FilePath = basePath + "Police - US.wav"
});
data.Items.Add(new SoundData
{
Title = "呜呜祖拉",
FilePath = basePath + "Vuvuzela.wav"
});
return data;
}
}
}
View Code