我正在从我的Silverlight项目中删除XAML并使其仅使用代码(根据this article)。
这是我为Silverlight应用程序创建的非常简单的启动事件(使用模板项目中的标准App.xaml):
private void Application_Startup(object sender, StartupEventArgs e)
{
Grid grid = new MainPage();
this.RootVisual = grid;
var mediaElement = new MediaElement();
mediaElement.MediaFailed += (s, ea) => { mediaFailed = true; };
mediaElement.Source = new Uri(@"/Content/Some Music.mp3", UriKind.Relative);
grid.Children.Add(mediaElement);
}
MP3文件设置为“Build Action:None,Copy if newer”(即:它位于XAP旁边)。这是MainPage的XAML:
<Grid x:Class="TestGame.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Grid>
C# - 这里没什么不寻常的。
public partial class MainPage : Grid
{
public MainPage()
{
InitializeComponent();
}
}
到目前为止一切都有效。所以我的问题是:为什么当我改变时
Grid grid = new MainPage();
到
Grid grid = new Grid();
调用mediaElement.MediaFailed
事件(使用AG_E_NETWORK_ERROR)?
InitializeComponent
唯一有趣的事情就是调用Application.LoadComponent
(这是默认生成的代码)。那么该函数可以做些什么来允许源URI工作呢?
似乎Application.GetResourceStream
仍然正常。但我需要能够在XAP外部获得一些资源。
(注意:似乎this guy遇到了同样的问题 - 但没有人回答他的问题。)
答案 0 :(得分:1)
关键因素是 UriKind.Relative 。问题是它的相对性是什么?
LoadComponent
的一个影响是它改变了“/”的位置。在LoadComponent
执行路径之前,“/”指的是与在主机浏览器中执行的位置相同的位置。在LoadComponent
之后,“/”指的是Xap的根内容与包含Xap的文件夹的混合。
由于您是通过独立的测试html页面运行它,因此第二个示例中的“/”指的是物理驱动器的根目录,例如“C:\”。
如果您将Url更改为“Content / Some Music.mp3”(即删除“/”前缀)并假设您的测试html页面与Xap相同,则应该按预期工作。
请注意,您无法使用父路径“..”转义混合路径,Silverlight不允许您这样做。