2

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

4

4 回答 4

2

除非您用来显示 Flash 内容的控件是内置在 WPF 中的,否则您将遇到这些“空域”问题。从 Win32 到 WinForms 的每一种显示技术都在“底层”使用 HWND,但 WPF 使用 DirectX。然而,Windows 中的窗口管理器仍然只理解 HWND,因此 WPF 应用程序有一个基于 HWND 的顶级窗口,并且在该窗口下的所有内容都在 DirectX 中完成(实际上,上下文菜单和工具提示等内容也有顶级 HWND) . Adam Nathan 在本文中对 WPF 互操作进行了很好的描述。

于 2008-09-16T17:00:41.423 回答
1

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

于 2008-09-15T23:23:47.080 回答
0

您可以使用 Expression 将 Flash 内容转换为 XAML 吗?我相信那里或旁边有工具可以做到这一点。

于 2008-09-15T21:30:10.350 回答
-1

只是一直在努力解决如何通过显示 Flash 的能力上传和使 WPF 透明的问题,因为如果您在 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 中将“假”设置为“允许透明度”并将“窗口样式”设置为“无”。之后,我使用了来自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;
于 2014-03-16T09:18:21.720 回答