Дружим 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# 😉
Поделиться в соцсеть
Оставить комментарий