没有XAML的Silverlight使源URI失败?

时间:2010-09-23 02:38:40

标签: silverlight xaml

我正在从我的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遇到了同样的问题 - 但没有人回答他的问题。)

1 个答案:

答案 0 :(得分:1)

关键因素是 UriKind.Relative 。问题是它的相对性是什么?

LoadComponent的一个影响是它改变了“/”的位置。在LoadComponent执行路径之前,“/”指的是与在主机浏览器中执行的位置相同的位置。在LoadComponent之后,“/”指的是Xap的根内容与包含Xap的文件夹的混合。

由于您是通过独立的测试html页面运行它,因此第二个示例中的“/”指的是物理驱动器的根目录,例如“C:\”。

如果您将Url更改为“Content / Some Music.mp3”(即删除“/”前缀)并假设您的测试html页面与Xap相同,则应该按预期工作。

请注意,您无法使用父路径“..”转义混合路径,Silverlight不允许您这样做。