
- •#024 – Знакомство с wpf/e
- •#023 – Введение в wpf, reloaded…
- •#022 Введение в Microsoft Interactive Designer rc1
- •#021 Применение 3d в wpf - Часть 2
- •#020 Применение 3d в wpf - Часть 1
- •#019 Введение в возможности 3d на wpf
- •#018 Размещение контрола net 2.0 на форме wpf
- •Imports System.Windows.Forms.Integration
- •#019 Введение в возможности 3d на wpf
- •#017 Первое Web-приложение / Подробнее о Grid / Элемент Frame
- •#016 Exe, xbap, xaml? - Все равно!
- •#015 Рисуем при помощи Visual Brush
#018 Размещение контрола net 2.0 на форме wpf
В
процессе изучения технологии 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.