Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
03.11.13 / ! / Создаем контекстно.doc
Скачиваний:
54
Добавлен:
08.06.2015
Размер:
2.64 Mб
Скачать

#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.

Соседние файлы в папке !