我们有一些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源?
答案 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);