如何在 WPF 表单中托管 Flash 内容并在我的 WPF 窗口上仍然使用透明度/alpha?承载 WinForms flash 控件不允许这样做。
4 回答
除非您用来显示 Flash 内容的控件是内置在 WPF 中的,否则您将遇到这些“空域”问题。从 Win32 到 WinForms 的每一种显示技术都在“底层”使用 HWND,但 WPF 使用 DirectX。然而,Windows 中的窗口管理器仍然只理解 HWND,因此 WPF 应用程序有一个基于 HWND 的顶级窗口,并且在该窗口下的所有内容都在 DirectX 中完成(实际上,上下文菜单和工具提示等内容也有顶级 HWND) . Adam Nathan 在本文中对 WPF 互操作进行了很好的描述。
虽然我没有这样做,但您可能可以使用 WPF 3.5 sp1 中的 WebBrowser 控件将您的 Flash 内容包装在 WPF 中。我不确定透明度会如何受到影响。
您可以使用 Expression 将 Flash 内容转换为 XAML 吗?我相信那里或旁边有工具可以做到这一点。
只是一直在努力解决如何通过显示 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 中将“假”设置为“允许透明度”并将“窗口样式”设置为“无”。之后,我使用了来自HERE和HERE的信息并创建了以下代码,该代码产生了在 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;