Как я могу разместить флэш-контент внутри формы WPF и при этом использовать прозрачность/альфа в моем окне WPF? Хостинг элементов управления флэш-памятью WinForms не позволяет этого.
Как можно разместить Flash-контент в приложении WPF и использовать прозрачность?
Ответы (4)
Если элемент управления, который вы используете для отображения содержимого Flash, не встроен в WPF, вы столкнетесь с этими проблемами с воздушным пространством. Каждая технология отображения от Win32 до WinForms использовала HWND под капотом, но WPF использует DirectX. Однако диспетчер окон в Windows по-прежнему понимает только HWND, поэтому приложения WPF имеют одно окно верхнего уровня на основе HWND, и все, что находится под ним, выполняется в DirectX (на самом деле такие вещи, как контекстные меню и всплывающие подсказки, также имеют HWND верхнего уровня) . У Адама Натана есть очень хорошее описание взаимодействия WPF в этой статье.
Хотя я этого не делал, вы, вероятно, можете использовать элемент управления WebBrowser, найденный в WPF 3.5 sp1, для переноса вашего содержимого Flash в WPF. Я не уверен, как это повлияет на прозрачность.
Можно ли использовать Expression для преобразования содержимого флэш-памяти в XAML? Я считаю, что есть инструменты внутри или сбоку, которые делают это.
Просто боролся с той же проблемой, как загрузить и сделать 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 «ложь» на «Разрешить прозрачность» и установил «Стиль окна» на «Нет». После этого я использовал информацию из ЗДЕСЬ и ЗДЕСЬ и создали следующую код, который дал желаемый эффект разрешения прозрачности в 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;