Как можно разместить Flash-контент в приложении WPF и использовать прозрачность?

Как я могу разместить флэш-контент внутри формы WPF и при этом использовать прозрачность/альфа в моем окне WPF? Хостинг элементов управления флэш-памятью WinForms не позволяет этого.


person Charley Rathkopf    schedule 15.09.2008    source источник


Ответы (4)


Если элемент управления, который вы используете для отображения содержимого Flash, не встроен в WPF, вы столкнетесь с этими проблемами с воздушным пространством. Каждая технология отображения от Win32 до WinForms использовала HWND под капотом, но WPF использует DirectX. Однако диспетчер окон в Windows по-прежнему понимает только HWND, поэтому приложения WPF имеют одно окно верхнего уровня на основе HWND, и все, что находится под ним, выполняется в DirectX (на самом деле такие вещи, как контекстные меню и всплывающие подсказки, также имеют HWND верхнего уровня) . У Адама Натана есть очень хорошее описание взаимодействия WPF в этой статье.

person Brian Stewart    schedule 16.09.2008

Хотя я этого не делал, вы, вероятно, можете использовать элемент управления WebBrowser, найденный в WPF 3.5 sp1, для переноса вашего содержимого Flash в WPF. Я не уверен, как это повлияет на прозрачность.

person Alan Le    schedule 15.09.2008
comment
Для чего это стоит: я пробовал это, и элемент управления WebBrowser прекрасно размещает Flash-контент, но вы не можете нарушать ограничения воздушного пространства, упомянутые выше. - person Lee Roth; 05.06.2009

Можно ли использовать Expression для преобразования содержимого флэш-памяти в XAML? Я считаю, что есть инструменты внутри или сбоку, которые делают это.

person Charles Graham    schedule 15.09.2008

Просто боролся с той же проблемой, как загрузить и сделать 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;
person Ailayna Entarria    schedule 16.03.2014