如何在WPF表单中托管Flash内容并在我的WPF窗口中仍然使用透明度/ alpha?托管WinForms Flash控件不允许这样做。
答案 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'设置为“允许透明度”并将“窗口样式”设置为“无”。之后我使用了来自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;