如何使用非相对uri指定MediaElement.Source?

时间:2011-04-12 11:25:03

标签: wpf

我们有一些WPF模块托管在cpp非托管/托管应用程序中。在为媒体内容指定相对Uri时,这种环境会引起麻烦。例如,我没有在testapp中做这样的事情的问题:

    <MediaElement Grid.Row="0"  x:Name="player"  Source="media\Getting started with.wmv" LoadedBehavior="Manual" UnloadedBehavior="Stop" Stretch="Fill" 
        MediaOpened="Element_MediaOpened" MediaEnded="Element_MediaEnded"/>

但是,如上所述,这在生产代码中不起作用。

如果我尝试使用这样的包模式:

Source="pack://application:,,,/media/Getting started with.wmv"

我得到例外:

Cannot navigate to application resource 'pack://application:,,,/media/Getting started with.wmw' by using a WebBrowser control. For URI navigation, the resource must be at the application�s site of origin. Use the pack://siteoforigin:,,,/ prefix to avoid hard-coding the URI.

如果我尝试使用这样的'siteoforigin'架构:

Source="pack://siteoforigin:,,,/media/Getting started with Olga 7.wmv"

我收到另一个错误:

Application identity is not set.

媒体文件设置为“内容”并设置为“始终复制”。

如何在Wpf桌面应用程序中使用绝对uri指定MediaElement源?

2 个答案:

答案 0 :(得分:1)

我找到了解决方案(有点)。我猜测相对url无法解析,因为主.exe是一个cpp mfc应用程序。所以为了创造绝对的uri,我做了类似的事情:

        player.Source = new Uri(CreateAbsolutePathTo("media/Getting started with.wmv"), UriKind.Absolute);

    private static string CreateAbsolutePathTo(string mediaFile)
    {
        return Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, mediaFile);
    }

我绑定到一个viewmodel所以这个逻辑被包装到viewmodel上的一个属性中,而源是在xaml中的数据绑定。

它的工作,但它并不像我希望的那样漂亮。

答案 1 :(得分:0)

只有你需要这样做:

        MediaElement bb = new MediaElement();
        stage.Children.Add(bb);
        bb.Source = new Uri("Recursos/MagicWandNoise.wav", UriKind.Relative);
        Debug.WriteLine("URL:" + bb.Source);
        bb.LoadedBehavior = MediaState.Manual;
        bb.Play();

然后在您的文件夹debug中添加二进制资源,请检查此link

请记住媒体元素工作正常,您需要添加Visual 3

        Canvas.Children.Add(bb);