Xamarin.Forms如何将音频文件正确生成到AppResources.Designer.cs
Xamarin.Forms .resx资源文件无法自动生成音频对应Designer属性的修复方案
问题描述
开发Xamarin.Forms应用时采用.resx文件实现本地化,需要在Resources文件夹添加Beep.wav音频资源。
正常情况下AppResources.Designer.cs会自动生成对应流资源属性:
/// <summary> /// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. /// </summary> internal static System.IO.UnmanagedMemoryStream Beep { get { return ResourceManager.GetStream("Beep", resourceCulture); } }
目前该属性无故消失,即使通过增删resx内字符串触发Designer文件重新生成,Beep对应属性也不会自动生成。手动添加代码可临时运行,但每次resx重新生成时代码都会被覆盖。
调用音频资源时会抛出找不到Beep资源的错误,报错代码位置:
private static readonly ISimpleAudioPlayer _beepPlayer; static MediaPlayerHelper() { _beepPlayer = CrossSimpleAudioPlayer.CreateSimpleAudioPlayer(); _beepPlayer.Load(Resources.AppResources.Beep); // 此处报错 }
修复步骤
- 打开
AppResources.resx设计视图(双击解决方案资源管理器中的resx文件即可打开),将设计器顶部的资源类型筛选从默认的「字符串」切换为「音频」分类 - 点击设计器顶部「添加资源」的下拉按钮,选择「添加现有文件」,选中本地存储的
Beep.wav完成导入。不要手动将wav文件拷贝到Resources目录后直接修改resx XML内容,这种方式会缺失资源类型元数据,导致代码生成器无法识别,不会输出对应属性 - 导入后选中Beep条目,在属性面板确认「持久性」配置为「嵌入在.resx中」,保存resx文件后,Designer.cs会自动重新生成Beep对应的流属性
- 如果完成上述操作后仍未生成属性,右键项目选择「卸载项目」,编辑
.csproj文件,确认AppResources.resx的嵌入资源配置包含正确的代码生成器设置:
<EmbeddedResource Update="Resources\AppResources.resx"> <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>AppResources.Designer.cs</LastGenOutput> </EmbeddedResource>
修改完成后重新加载项目,再次保存resx文件即可触发正常生成
- 额外排查:确认单独放在Resources文件夹下的
Beep.wav文件的生成操作没有设置为「嵌入的资源」,避免重复嵌入引发的识别冲突
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

