Персональный сайт Александра Тауениса » Дружим Xwt и Windows Forms через WPF

Дружим Xwt и Windows Forms через WPF

Вчера на Хабрахабре вышла статья про новый неизведанный фреймворк для абстракции .net-программ от системных реализаций интерфейса — XWT (Xamarin Window Toolkit). Документации на него ноль. Однако случайно наткнулся на одну интересную функцию иксвэтэ — Xwt.Application.InitializeAsGuest (Xwt.ToolkitType.*). Никакой документации на неё пока что нет. Но это ведь не помеха? Приступим к изучению!
Заранее предупреждаю, что необходима среда .Net 4.0 и выше (т.е. Visual Studio 2010+). Перекомпиляция XWT под .Net 3.5/2.0/1.1 весьма нетривиальная задача.

Итак, пишут, что она позволяет встраивать XWT в имеющиеся формы GTK, WPF, MonoMac. А Windows Forms что, в пролёте?

На дальней «полке» списка элементов дизайнера WinForms в VS ещё с 2008 версии лежит достаточно интересный контрол, System.Windows.Forms.Integration.ElementHost. Этот элемент управления позволяет встраивать элементы WPF в имеющиеся Windows-формы. Добавляем на форму. Форма теперь может содержать элементы управления WPF.

Теперь необходимо подключить XWT. На данный момент необходимо скачать исходники из репозистория: git clone https://github.com/mono/xwt.git и скомпилировать проекты Xwt.csproj и Xwt.Wpf.csproj по-отдельности (их общее решение пока что целиком не компилируется). Полученные библиотеки Xwt.dll и Xwt.Wpf.dll присоедините к проекту. Можно считать, что поддержка тулкита обеспечена.

Теперь нужно инициализировать Xwt как «гостя», создать «абстрактные» элемент(ы) управления, и вернуть их в реальность, в смысле, в ElementHost.

//init xwt as guest

Xwt.Application.InitializeAsGuest(Xwt.ToolkitType.Wpf);

 

//create a xwt control

Xwt.Button thecontrol = new Xwt.Button(«This is a Xwt button!»); //the xwt control

 

//get the toolkit for the current engine

Xwt.Toolkit t = Xwt.Toolkit.CurrentEngine;

 

//get the native widget using the toolkit

elementHost1.Child = (System.Windows.UIElement)t.GetNativeWidget(thecontrol);

 

Комментарии я написал на английском, но, думаю, понятно. Xwt.Application.InitializeAsGuest инициализирует XWT как готовый к встраиванию. Далее создаётся абстрактированный от ОС элемент управления thecontrol (в данном случае это — кнопка). Затем создаётся «мост» t между программой и XWT, через который в elementHost1, в его чрево (.Child), засовывается отрендеренный в виде WPF-материи абстрактный элемент управления thecontrol.

Как Вы могли заметить, элемент управления получился во весь ElementHost. Почему это случилось, вы узнаете из следующей статьи.

 

Кто хочет — может попробовать тоже самое с GTK# 😉



Оставить комментарий

Защита от спама * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.