




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