Опрос
Вы участвуете в программе Windows Insider?
Популярные новости
Обсуждаемые новости

18.08.2006 05:42 | Raiker

В процессе изучения технологии Avalon мы уже изучали способы объединения двух технологий - библиотеки .NET 2.0 и кода WPF. В статье №009 мы рассмотрели возможности использования классов WindowsForms в приложениях Avalon, а в статье №010 рассмотрели способ размещения контрола, подготовленного в WPF, на форме .NET 2.0 . Сегодня мы рассмотрим достаточно часто задаваемый вопрос и на форумах MSDN, и на нашем форуме. Мы разместим контрол из библиотеки WindowsForms на форме Avalon, а также поговорим об ограничениях, с которыми могут столкнуться разработчики, при реализации этой задачи.

Сегодня мы разместим на форме проекта WinFX всем известный контрол WebBrowser. Создайте новый проект типа WinFX Windows Application и задайте ему имя "MyWebApp".

Разместить элемент WebBrowser на нашей форме очень просто. Прежде всего необходимо добавить ссылки (reference) на библиотеки WindowsFormsIntegration и System.Windows.Forms к нашему проекту:



Если вы затрудняетесь в выполнении этого задания, обратитесь к статьям №009 и №010 для получения подробных инструкций по подключению ссылок на библиотеки к проекту.

В режиме редактирования VB-кода добавьте такую строку перед описанием класса Window1:

Imports System.Windows.Forms.Integration



Теперь вернитесь в режим редактирования XAML-кода и приведите ваш код в соответствие со следующим рисунком:



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

Теперь давайте используем подключенные библиотеки. В начале работы мы подключили к проекту файл WindowsFormsIntegration. Эта операция позволяет нам получить доступ к особому контейнеру WindowsFormsHost, который может содержать в себе .NET 2.0 элементы. Поэтому добавляем такой код в тело контейнера Grid:

<WindowsFormsHost Name="wfh"
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Stretch">
</WindowsFormsHost>


Теперь мы можем разместить внутри этого контейнера элемент WebBrowser:

<WindowsFormsHost Name="wfh"
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Stretch">
       
     <mcl:WebBrowser Name="mc"/>
       
</WindowsFormsHost>


Обратите внимание, что тегу WebBrowser предшествует префикс "mcl" - тот самый, который мы указали в качестве ссылки на подключаемую библиотеку System.Windows.Forms (см. рисунок выше).

На этом размещение элемента Net 2.0 на форме WPF заканчивается. Тем не менее, необходимо еще разобраться, как получить доступ к этому контролу. Перейдите в режим редактирования VB-кода и добавьте такой код в конструктор NEW():

Dim mc As System.Windows.Forms.WebBrowser = wfh.Child
mc.Navigate("http://www.thevista.ru")


Мы создали некую переменную "mc" типа WebBrowser и присвоили ей в качестве значения тот элемент, который находится внутри контейнера WindowsFormsHost. Этот способ позволил нам второй строкой получить управление над контролом.

Запускаем проект:



Мы решили поставленную задачу. Однако, есть одно неприятное ограничение. Если вы попытаетесь разместить не-Avalon контрол на WPF-форме, к которой применено свойство AllowsTransparency=True то ваш контрол будет невидим!

Этот вопрос широко обсуждался на форумах MSDN и я привиду вам официальный ответ программистов Microsoft.

"Пиксельная прозрачность использует совершенно другую модель отображения нежели Win32-код. Более не существует системное событие WM_PAINT. Вместо этого окно верхнего уровня создает растровое изображение и отсылает его операционной системе для последующего представления на экране. Child-окна (зависимые от главного) не попадают в это растровое изображение, поэтому и не отображаются на экране"

А так как тот-же WebBrowser является полноценным окном (по своей сути, так как он построен на чистом Win32), то он будет невидимым при использовании AllowsTransparency.

В заключении хочу обратить ваше внимание на то, что данное ограничение не является ограничением WPF, как библиотеки, а является следствием несовместимости моделей рисования Win32 и Avalon.

Espoir, TheVista.ru Team
Август, 2006

Комментарии

Комментариев нет...
Для возможности комментировать войдите в 1 клик через

По теме

Акции MSFT
420.55 0.00
Акции торгуются с 17:30 до 00:00 по Москве
Все права принадлежат © ms insider @thevista.ru, 2022
Сайт является источником уникальной информации о семействе операционных систем Windows и других продуктах Microsoft. Перепечатка материалов возможна только с разрешения редакции.
Работает на WMS 2.34 (Страница создана за 0.029 секунд (Общее время SQL: 0.013 секунд - SQL запросов: 51 - Среднее время SQL: 0.00026 секунд))
Top.Mail.Ru