Использование Windows Presentation Foundation в VSTO – с “Crossbow”

Автор: Topol Воскресенье, Май 6th, 2012 Нет комментариев

Рубрика: Операционные системы

Я работаю с WPF еще с TechEd. Клиенты спрашивали у меня возможно ли использовать WPF  (Avalon) в VSTO. Это возможно, т.к. мы имеем дело с CTP выпуском Beta релиза, поэтому все должно работать хорошо…

Я сказал клиенту, что смогу быстро написать небольшой образец, чтобы показать ему как все сделано и вот решил поделиться этим образцом в этой статье с Вами.

На самом же деле, быстро написать образец у меня не получилось, но в конце концов я это сделал. Как и любой типичный код, этот предоставляется “as is”(как есть) без гарантий или обещаний, подразумеваемых или формулированных. Данный пример всего лишь покажет с чего можно начать.

Для того, чтобы воспользоваться данным примером, нужно убедиться, что у Вас установлено все необходимое для его просмотра. Вам нужен Visual Studio Tools для Office (или Visual Studio  Enterprise, содержащий VSTO). Затем Вам нужно начать установку Beta и CTP. Я производил установку перечисленного на Virtual PC. Я не рекомендую устанавливать Beta приложения на главный компьютер. Поэтому лучше воспользоваться виртуальной машиной.

Первая Beta, которая нам понадобиться – Office 2007 Beta 2.

Следующее, что нам понадобиться это .Net Framework 3.0 June CTP. Вы наверное уже заметили, что мы вернули название .Net Framework, до этого был WinFX. Загрузите WinFX 3.0 Runtime Components Beta 2. Одна из причин столь долгого создания образца заключается в том, что я применил искусственный прием обхода некоторых UI ошибок в Beta 2. Хорошей новостью является то, что эти ошибки были исправлены в 3.0 версии. И мне пришлось обновить данный образец для нового CTP. Итак, если у Вас WinFX Beta 2, то могут возникнуть некоторые проблемы при отображении средств управления WPF. Но как я уже скачал в последней версии все проблемы были устранены.

Далее нам будет нужен VSTO June CTP “v3”. И последнее, что нам понадобится, это .Net Framework 3.0 Development Tools June CTP (под кодовым названием “Cider”). Чтобы использовать .Net Framework 3.0 Development Tools June CTP будет нужен .Net Framework 3.0.

Итак, у нас есть все необходимое. Вы заметите, что существует шесть проектов. Скорее всего Вы подумали, что ExcelAddin1 и WordAddin1 созданы для Excel и Word соответственно. Но мы познакомимся с ними чуть позже. Эти проекты связаны с addins. Вы можете пренебречь этими проектами, т.к. они используются только, когда Вы публикуете свои addins.

Так же есть два проекта WPF: TaskPaneControlDesign и TaskPaneControls. Первый – TaskPaneControlDesign – я создал для удобства. Вы увидите почему, когда Вы смотрите на TaskPaneControls UserControl1.xaml, когда Вы дважды щелкните на нем, то загрузиться “designer”, но Вы увидите, что дизайнер пользовательского управления до этого не был вызван.

Итак, Я создал проект TaskPaneControlDesign для использования проектировщика средств управления. Откройте Window1.xaml и Вы увидите мою форму. Я зашел в XAML view, вырезал, а затем вставил код из <grid> тега в нижнюю часть WPFUserControl.xaml. Как Вы можете заметить WPFUserControl достаточно прост: он содержит TextBox и Button. Когда Вы нажмете на кнопку, появится окно сообщения, показывающее содержимое TexBox. Все достаточно легко и просто.

Интеграция “cross-bow” кода продублирована в проекте addin. Первым делом нужно создать правильные ссылки. Вам нужно добавить ссылки в WPF: PresentationCore, PresentationFramework и WindowsBase. Вам нужно сделать ссылку на “cross-bow”: WindowsFormsIntegretion. “Cross-bow” содержит класс ElementHost, который используется для соединения между собой WinForms и WPF.

Вы увидите, что мой WPF контрол является отдельным от addin проектом. Я сделал это нарочно. Я предполагаю, что есть возможность объединить WinForms и WPF код в одном проекте, но Вы столкнетесь с совпадением имен в одной и той же именованной области видимости, так как и WinForms и WPF имеют класс Buttons, как и многие другие типы проектов. Я решил их не объединять. Поэтому Вам придется сослаться на проект WPF.

Затем Вам нужно добавить WinForms UserControl в addin проект. Вы будете использовать его как базу для Custom Task Pane. Войдите во вкладку кода UseControl и Вы увидите следующий код:

Код:
private System.Windows.Forms.Integration.ElementHost elemHost;

public UserControl1()
{
InitializeComponent();
this.elemHost = new System.Windows.Forms.Integration.ElementHost();
this.elemHost.Child = new TaskPaneControls.WPFUserControl();
this.elemHost.Dock = DockStyle.Fill;
this.Controls.Add(this.elemHost);
}

Он достаточно прост. ElementHost является WinForms контролом, который может принимать WPF контролы. Мы создаем ElementHost, а затем контрол WPF(TaskPaneControls.WPFUserControl) и устанавливаем его как дочерний на ElementHost. Затем Я установил DockStyle.Fill на ElementHost для заполнения WinForms UserControl. Затем Я добавляю ElementHost к коллекции контролов на WinForms UserControl.

Заключительная часть кода находится в ThisApplication.cs и является стандартным кодом добавления CustomTaskPane в Word или Excel:

Код:
private void ThisApplication_Startup(object sender, System.EventArgs e)
{
Microsoft.Office.Tools.CustomTaskPane ctp =
this.CustomTaskPanes.Add(
new WinFormsUserControl(), «WPF in Crossbow»);
ctp.Visible = true;
}

Конечно же, в этом коде мы добавляем WinFormsUserControl в Custom Task Pane.

Нажмите клавишу F5 и все должно заработать. Я установил WordAddin как запускной проект для более комфортной работы. Существует ошибка, которая затрагивает ExcelAddin – кажется невозможным что-либо напечатать в TexBox в WPF контроле.

Но это то, чем страдает Beta и CTP версии. Пожалуйста испытайте данный материал и сообщите о найденных ошибках. Испытайте другие приложения Office, сделайте какие-нибудь забавные вещи. Чем больше мы найдем ошибок в Beta, тем меньше их будет в финальных версиях продуктов.

Источник: thevista.ru

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

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты