如何在WPF应用程序中托管Flash内容并使用透明度?

时间:2008-09-15 21:26:33

标签: wpf flash

如何在WPF表单中托管Flash内容并在我的WPF窗口中仍然使用透明度/ alpha?托管WinForms Flash控件不允许这样做。

4 个答案:

答案 0 :(得分:2)

除非用于显示Flash内容的控件是在WPF中构建的,否则您将遇到这些“空域”问题。从Win32到WinForms的每种显示技术都在“引擎盖下”使用了HWND,但WPF使用DirectX。然而,Windows中的Window Manager仍然只能理解HWND,因此WPF应用程序有一个基于HWND的顶级窗口,其下的所有内容都在DirectX中完成(实际上上下文菜单和工具提示也有顶级HWND) 。 Adam Nathan在this article中对WPF互操作有很好的描述。

答案 1 :(得分:1)

虽然我还没有这样做,但你可以使用WPF 3.5 sp1中的WebBrowser控件将你的Flash内容包装在WPF中。我不确定透明度会如何受到影响。

答案 2 :(得分:0)

您可以使用Expression将Flash内容转换为XAML吗?我相信有一些工具可以在那里或者在旁边执行此操作。

答案 3 :(得分:-1)

一直在努力解决如何上传和播放的相同问题使WPF透明,能够显示Flash,因为如果在MainWindow上启用“允许透明度”,一旦应用程序运行,Flash就不会显示。

1)我使用WebBrowser Control播放Flash(.swf)文件。它们在我的电脑上,但它可以从互联网或任何你托管它们的地方播放。不要忘记将WebBrowser控件命名为C#。

 private void Window_Loaded(object sender, RoutedEventArgs e)
 {   
    MyHelper.ExtendFrame(this, new Thickness(-1));    
    this.MyBrowser.Navigate(@"C:\Happy\Download\flash\PlayWithMEGame.swf");         
 }

2)现在提供透明度。我已将WPF中的'false'设置为“允许透明度”并将“窗口样式”设置为“无”。之后我使用了来自HEREHERE的信息并创建了以下代码,这些代码产生了在MainWindow上允许透明度并同时运行Flash的预期效果,这是我的代码:

public class MyHelper
{
    public static bool ExtendFrame(Window window, Thickness margin)
    {
        IntPtr hwnd = new WindowInteropHelper(window).Handle;
        window.Background = Brushes.Transparent;
        HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
        MARGINS margins = new MARGINS(margin);
        DwmExtendFrameIntoClientArea(hwnd, ref margins);
        return true;
    }
    [DllImport("dwmapi.dll", PreserveSig = false)]
    static extern void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);
}

 struct MARGINS
    {
        public MARGINS(Thickness t)
        {
            Left = (int)t.Left;
            Right = (int)t.Right;
            Top = (int)t.Top;
            Bottom = (int)t.Bottom;
        }
        public int Left;
        public int Right;
        public int Top;
        public int Bottom;
    }

从Window_Loaded()调用它,你需要'下面'行'DllImport'才能工作。

using System.Runtime.InteropServices;
using System.Windows.Interop;