背景

最近一个 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