在最近的一个WPF应用中,有这样一个需求:WPF本身生成数据,然后调用Flex编译生成的Flash完成数据的树形结构可视化显示。这就需要在WPF中嵌入Flash,下面详细介绍一下具体的做法。
开发环境:Win7+Visual Studio 2010+ Adobe Flash Builder 4.6
1. 向WPF项目中添加Shockwave Flash Object,在菜单中选择 工具(T)->选择工具箱项(X),然后选中COM组件选项卡,从中选取Shockwave Flash Object,点击确定完成添加
说明:在这一步可能出现COM组件选项卡中并没有Shockwave Flash Object选项的情况,这说明系统中还没有安装或注册Flash插件,可以到%windir%\System32\Macromed\Flash目录下查看是否存在后缀为.ocx的flash插件。如果没有安装Flash插件,需要用IE打开http://get.adobe.com/flashplayer/来获取并安装最新的Flash ActiveX插件。
2. 在WPF项目的设计界面,向主窗体MainWindow.xaml上添加控件WindowsFormsHost,用来容纳Shockwave Flash Object。
3. 创建用于Windows窗体的用户控件(User Control),并向FlashControl中拖曳添加Shockwave Flash Object(WPF Application 作为一个展现层的项目,不能自身插入 COM Component,所以需要借助Windows Form引入ActiveX控件)。添加一个Shockwave Flash Object 后会自动在FlashControl中增加一个AxShockwaveFlashObjects.AxShockwaveFlash对象。
4. 在MainWindow的Window_Loaded方法中创建AxShockwaveFlashObjects.AxShockwaveFlash对象并添加到WindowsFormsHost容器中,代码如下:
AxShockwaveFlashObjects.AxShockwaveFlash axShockwaveFlash = new AxShockwaveFlashObjects.AxShockwaveFlash(); windowsFormsHost1.Child = axShockwaveFlash; string swfPath = System.Environment.CurrentDirectory; swfPath += @"\demo.swf"; axShockwaveFlash.Movie = swfPath; //指定播放的flash文件路径 axShockwaveFlash.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(axShockwaveFlash_FlashCall);//添加flash调用处理方法,让WPF可以处理来自Flash的调用请求
5. 运行程序,可以看到WPF中成功嵌入了Flash,如下图所示:
通过上述方法可以简单地实现在WPF中播放Flash,对于Flex程序,可能还会要求Flash和WPF主程序进行互相通信传递消息,这时可以通过Flex的ExternalInterface类与容器应用程序进行通信。