如何在 WPF 中嵌入 Flash (ActiveX)


背景

最近一个 Partner 希望将以前的 Flash 嵌入到一个全新的 WPF 应用中,将 WPF 在 .NET 3.0 下丰富的用户体验和 Flash 动画相结合,更好地服务于其用户。


嵌入 Flash 相当于嵌入一个 ActiveX 控件,在嵌入过程中也有一些比较 Tricky 的地方需要注意,下面就在 WPF Application 中嵌入 Flash 控件的步骤进行简要说明,并将遇到的一些需要注意的问题进行提示。


开发环境


Visual Studio 2008 Beta1 (Code name: Orcas), Windows Vista, Flash Player 9,


方法


1. 建立 WPF Application。


首先,建立一个名为 FlashinWPF 的 WPF Application


image


2. 设置 Window 属性。


在 XAML 中修改 Window 的属性,加入 Loaded 事件,设置默认 Grid 的 x:Name 标示为 “FlashGrid” 更改后代码如下:


<Window x:Class=”FlashinWPF.Window1″
    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
    Title=”Flash in WPF” Loaded=”WindowLoaded” Height=”500″ Width=”600″>
    <Grid x:Name=”FlashGrid”>
    </Grid>
</Window>

3. 建立 Windows Forms Control Library 

WPF Application 作为一个展现层的项目,不能自身插入 COM Component,所以需要借助 Windows Form 引入 ActiveX 控件。


image


 


4. 插入 Shockwave Flash Object


在 Toolbox 中点击右键,选择”Choose Items…” 添加 COM Components


image


 


Tricky Point: 在 COM Component中还有一个 Macromedia Flash Factory Object 同样链接到C:\Windows\System32\Macromed\Flash\Flash9c.ocx 中,但在这里不要选择这个 Component, 否则会出现“Failed to import the ActiveX control” 可以利用 regsvr32.exe Flash9c.ocx 在命令行中注册 Flash9c.ocx 控件。会出现如下注册成功提示:


 


image


 


5. 创建 Flash Object


添加一个 Shockwave Flash Object 后会自动在 Flash Control 的项目中增加一个名为AxShockwaveFlashObjects 的对象。


在 UserControl1.Designer.cs 中会默认添加 axShockwaveFlash1 对象。


private AxShockwaveFlashObjects.AxShockwaveFlash axShockwaveFlash1;

6. 编译 Flash Control

image


 


7. 在 FlashinWPF 中增加 Reference


增加 Flash Control 中编译好的 AxInterop.ShockwaveFlashObjects.dll


image


 


增加用于在 Windows Form 中整合 ActiveX 的 DLL


image


 


增加 Windows Form DLL


image


 


8. 修改 Window 的 Codebehind


Window1.xaml.cs 代码及注释如下


private void WindowLoaded(object sender, RoutedEventArgs e)
 {
     // 创建 host 对象
     System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost();

     // 实例化 axShockwaveFlash1
     AxShockwaveFlashObjects.AxShockwaveFlash axShockwaveFlash1 = new AxShockwaveFlashObjects.AxShockwaveFlash();

     // 装载.axShockwaveFlash1
     host.Child = axShockwaveFlash1;

     // 将 host 对象嵌入FlashGrid
     this.FlashGrid.Children.Add(host);

     // 设置 .swf 文件相对路径
     string swfPath = System.Environment.CurrentDirectory;
     swfPath += @”\sample.swf”;
     axShockwaveFlash1.Movie = swfPath;
 }


9. 添加 .swf 文件

选择 Always Copy to Output Directory 从而应用相对路径通过 WPF Applicaiton 调用 Flash

image


 


10. 大功告成


image 


本例工程文件 点此下载


小贴士


可以通过 Visual Studio 中强大的 Object Browser 来查看 FlashObjects 的各种方法,抽象类,如下图所示


image


FlashinWPF.zip

Comments (2)

  1. Fdream says:

    在WPF中有没有什么办法可以使SWF透明呢?我尝试了设置swf的Wmode属性为Transparent没有作用

  2. joe says:

    swf 文件是否打包在exe里面了?swf能否不再程序运行目录里面存在?

Skip to main content