Поместить изображение поверх ошибки управления веб-браузером

У меня есть изображение, которое нужно разместить поверх WebBrowser. Проблема в том, что бы я ни делал, изображение всегда оказывается за WebBrowser элементом управления. Я не могу использовать Awesomium, настраиваемый элемент управления веб-браузера, который использует Chrome вместо IE ActiveX, поскольку Awesomium не может загружать файлы XBAP.

Я искал почти везде, но не могу найти правильного решения этой проблемы.

Как я могу отобразить изображение поверх элемента управления WPF WebBrowser?


person Community    schedule 03.07.2012    source источник


Ответы (3)


Я подозреваю, что WPF WebBrowser реализован в аналогично Silverlight и WinRT (также известному как Windows 8 Metro).

_2 _ в Silverlight и _3 _ в WinRT / Metro всегда сверху в Z-порядке. Очевидно, это связано с тем, что они использовали элемент управления Trident ActiveX. Чтобы обойти проблему Z-порядка, _ 4_ и _ 5_.

К сожалению, похоже, что WPF не предоставляет кисть для этой цели.

Поискав в Интернете, похоже, что есть люди, которые с разной степенью успеха пытались имитировать это поведение кисти. Однако это может вам не помочь, поскольку использование любой кисти удаляет интерактивность с визуализированным контентом.

person Jeff Yates    schedule 03.07.2012
comment
Вы гений ... но ... Можете ли вы указать мне правильное направление, возможно, веб-сайт или что-то в этом роде, или ресурс, или, в любом случае, пользовательский веб-элемент управления помимо awesomium, который позволит мне сделать что-то подобное? - person ; 03.07.2012
comment
Я искал вокруг и до сих пор не нашел ничего, что было бы полезно. Я буду продолжать искать и обновлять, если что-нибудь найду. - person Jeff Yates; 03.07.2012
comment
Спасибо, человек, потому что до сих пор я прочитал, что большинство людей рекомендует другим использовать всплывающие окна для наложения изображений, но для меня это не подходит - person ; 03.07.2012
comment
Вы также можете попробовать это, хотя я подозреваю, что это может вызвать другие проблемы: social.msdn.microsoft.com/Forums/en-US/wpf/thread/ - person Jeff Yates; 03.07.2012
comment
Есть также подход всплывающих окон, который выглядит многообещающим. Почему это тебе не подходит? stackoverflow.com/a/1073583/23234 - person Jeff Yates; 03.07.2012
comment
Обратите внимание на этот рендерер. На самом деле это может помочь реализовать идею кисти браузера. codeplex.com/WPFWin32Renderer - person Jeff Yates; 03.07.2012
comment
Вау, спасибо, чувак, за помощь. Всплывающее окно не работает, потому что изображение имеет обратный вызов в исходное приложение. Таким образом, обратный вызов не может быть зарегистрирован, если он отображается во всплывающем окне. и это будет неуместно .... эй, последнее, что ты знаешь, как я могу обновить веб-страницу с помощью C #? например, нажав кнопку обновления в Internet Explorer ... - person ; 03.07.2012
comment
Я не знаю наверняка, но подозреваю, что обновление достигается путем вызова Navigate для текущего URL-адреса. - person Jeff Yates; 03.07.2012

Веб-браузер WPF не является НАСТОЯЩИМ элементом управления WPF, но использует некоторый HwndHost, чтобы показать некоторые полезности IE. Это приводит к проблеме "Воздушное пространство WPF" (которая должна быть исправлена ​​с помощью .net 4.5). Единственный вариант отображения изображения над элементом управления веб-браузером - это поместить его во всплывающем окне над веб-браузером. Всплывающие окна имеют свой собственный Win32 Hwnd и, следовательно, имеют собственное «воздушное пространство».

просто сделай что-нибудь вроде

<WebBrowser Name="web">
</WebBrowser>
<Popup PlacementTarget="{Binding ElementName=web}" Placement="Center" IsOpen="true">
 <Image Source="blub.png"/>
</Popup>
person Joachim Kerschbaumer    schedule 03.07.2012

В WPF 4.5 проблема не решена. На некоторых форумах была некоторая информация, например, указанные ниже свойства будут доступны с версией 4.5 элемента управления веб-браузером, однако этот план был отменен. Так что вам нужно решить проблему с воздушным пространством самостоятельно.

WebBrowser.CompositionMode = System.Windows.Interop.CompositionMode.Full; WebBrowser.IsRedirected = true;

Обходной путь, который вы могли бы сделать, - это сделать высоту элемента управления веб-браузера равной нулю, когда какой-либо другой элемент управления находится перед элементом управления веб-браузера.

Найдите образец кода ниже,

Предположим, у вас есть элемент управления веб-браузера в Mainwindow. Когда вы выполняете какое-либо действие, например: нажимаете кнопку, у вас появляется другой пользовательский элемент управления, который находится над MainWindow. Однако из-за проблемы с Airspace веб-браузер не находится в родительском элементе управления и находится поверх вашего управления.

ИСПРАВЛЕНИЕ: стандартное исправление заключается в том, что вы можете установить нулевую высоту веб-браузера, когда вы запускаете какой-либо другой контроль над ним, в зависимости от вашего сценария. Ниже представлен образец реализации.

В MainWindow.Xaml включаем события.

Activated="Window_Activated"
Deactivated="Window_Deactivated"

В Xaml.cs обработайте сценарий, задав высоту.

private void Window_Activated(object sender, EventArgs e)
{
    wb.Height = double.NaN;
}

private void Window_Deactivated(object sender, EventArgs e)
{
    wb.Height = 0;
}
person Darey    schedule 06.11.2013