FAQ по интеграции WinForms и WPF

Как можно сохранить инвестиции, сделанные в приложения Windows Forms, но при этом воспользоваться мощными возможностями WPF?
Можно ли использовать элементы управления Windows Forms в приложении WPF?
Как быть с пользовательскими элементами управления и элементами управления сторонних разработчиков, в том числе с элементами управления ActiveX?
Как можно разместить элемент управления Windows Forms в приложении WPF?
Я не могу найти пространство имен System.Windows.Forms.Integration. Где оно находится?
Как можно разместить элемент управления WPF в приложении Windows Forms?
Как приступить к работе с этой технологией?
Куда можно сообщать об обнаруженных ошибках?
Будет ли выпущено средство для преобразования приложений Windows Forms в приложения WPF?
Когда будет выпущена эта технология?
Где можно найти документацию?

 

Вопрос. Как можно сохранить инвестиции, сделанные в приложения Windows Forms, но при этом воспользоваться мощными возможностями WPF?

Ответ. Большую часть приложения Windows Forms можно оставить неизменной и переносить на платформу WPF только нужные части приложения. Для этого необходимо определить области приложения, которые соответствуют возможностям WPF, и преобразовать только их. Например, можно преобразовать для WPF лишь несколько форм, а остальную часть приложения оставить на платформе Windows Forms. Это позволит открывать экземпляры страниц или окон WPF в приложении Windows Forms. Также можно заменить в форме элементы управления Windows Forms на элементы управления WPF, фактически создав гибридную форму, где сосуществуют элементы управления из разных платформ.

 

Вопрос. Можно ли использовать элементы управления Windows Forms в приложении WPF?

Ответ. Да, в приложении WPF в элементе управления WindowsFormsHost можно размещать элементы управления Windows Forms, что упрощает переход с платформы Windows Forms на WPF. Элемент управления WindowsFormsHost можно использовать в коде XAML после сопоставления пространства имен clr-namespace элемента управления Windows Forms с новым пространством имен xmlns, как и для любого внешнего элемента.

Этот элемент управления упрощает переход на новую технологию. Как правило, не рекомендуется использовать его для размещения элемента управления Windows Forms в новых проектах, за исключением случаев, когда эквивалентного элемента WPF нет. В некоторых случаях у элементов управления Windows Forms, в отличие от элементов WPF, невозможно изменять размер. Их нельзя растягивать, поворачивать и наклонять, и на изменение размера и макета они реагируют не так, как элементы управления WPF.

 

Вопрос. Как быть с пользовательскими элементами управления и элементами управления сторонних разработчиков, в том числе с элементами управления ActiveX?

Ответ. С пользовательскими элементами управления Windows Forms следует обходиться точно так же, как со стандартными элементами управления Windows Forms, то есть их можно использовать в приложениях WPF. Что касается элементов управления сторонних разработчиков, все зависит от способа их реализации. Если они созданы в виде управляемых пользовательских элементов Windows Forms, они будут прекрасно работать в таком сценарии. Если они созданы в виде элементов управления ActiveX, их также можно использовать в приложениях WPF, если разместить в элементе управления WindowsFormsHost. В Windows Forms уже предусмотрена поддержка размещения элементов управления ActiveX, поэтому все, что нужно сделать, это создать управляемые оболочки для элемента управления ActiveX, а затем с помощью этих оболочек создать экземпляр элемента управления и разместить его в элементе WindowsFormsHost в окне или на странице WPF. Еще один удобный способ — просто создать пользовательский элемент управления Windows Forms, содержащий элемент управления ActiveX, и разместить этот пользовательский элемент управления в элементе WindowsFormsHost.

 

Вопрос. Как можно разместить элемент управления Windows Forms в приложении WPF?

Ответ. Сначала необходимо добавить ссылки на пространства имен System.Windows.Forms и System.Windows.Forms.Integration. Затем выбрать способ работы с элементами Windows Forms: с помощью кода, XAML или их сочетания. Если принято решение использовать только код, потребуется написать код, аналогичный следующему.

//Instantiate the hosting control

WindowsFormsHost host = new WindowsFormsHost();

//Instantiate the Windows Forms control, in this case a button

System.Windows.Forms.Button wfButton = new System.Windows.Forms.Button();

wfButton.Text = "Windows Forms Button";

// Add the Windows Forms button to the host control

host.Children.Add(wfButton);

// Add the host control to the WPF element that you want to parent the control,

// in this case it's a Grid

this.grid1.Children.Add(host);

Если используется XAML, также необходимо добавить ссылки на пространства имен System.Windows.Forms и System.Windows.Forms.Integration. Также потребуется добавить в код XAML операторы сопоставления, которые позволят ссылаться на объекты в этих пространствах имен в XAML.

<?Mapping XmlNamespace="wfi" ClrNamespace="System.Windows.Forms.Integration" Assembly="WindowsFormsIntegration"?>

<?Mapping XmlNamespace="wf" ClrNamespace="System.Windows.Forms" Assembly="System.Windows.Forms"?>

Свойство XmlNamespace позволяет создать тег, чтобы использовать его как префикс пространства имен в XAML для ссылок на элементы управления из пространств имен System.Windows.Forms и System.Windows.Forms.Integration. Для этого необходимо создать в XAML свойства xmlns, сопоставленные с этими префиксами.

<Window x:Class="AvalonApplication17.Window1"

xmlns="https://schemas.microsoft.com/winfx/avalon/2005"

xmlns:x="https://schemas.microsoft.com/winfx/xaml/2005"

xmlns:wfi="wfi"

xmlns:wf="wf"

Title="AvalonApplication17"

Loaded="WindowLoaded"

Затем можно использовать XAML для создания экземпляра элемента управления WindowsFormsHost и его дочерних элементов.

<Grid x:Name="grid1">

<wfi:WindowsFormsHost>

<wf:Button Text="Windows Forms Button"/>

</wfi:WindowsFormsHost>

</Grid>

 

Вопрос. Я не могу найти пространство имен System.Windows.Forms.Integration. Где оно находится?

Ответ. Пространство имен System.Windows.Forms.Integration определено в файле WindowsFormsIntegration.dll, который входит в комплект поставки WinFX SDK, но не в стандартный дистрибутивный пакет. Файл находится в папке \Program Files\Reference Assemblies\ Microsoft\Avalon\v2.0.50215.

 

Вопрос. Как можно разместить элемент управления WPF в приложении Windows Forms?

Ответ. Сначала следует добавить ссылки на пространства имен WPF (PresentationCore, PresentationFramework, UIAutomationProvider, UIAutomationTypes и WindowsBase). Затем необходимо создать экземпляр элемента управления ElementHost и элемент управления, которые требуется внедрить в приложение Windows Forms, и связать его с элементом управления ElementHost. Затем следует добавить элемент управления ElementHost в коллекцию элементов управления формы.

ElementHost host = new ElementHost();

System.Windows.Controls.ListBox wpfListBox = new System.Windows.Controls.ListBox();

for (int i = 0; i < 10; i++)

{

wpfListBox.Items.Add("Item " + i.ToString());

}

host.Dock = DockStyle.Fill;

host.Controls.Add(wpfListBox);

this.panel1.Controls.Add(host);

Однако если элемент управления WPF, который необходимо использовать в приложении Windows Forms, определен в коде XAML, в проект также потребуется добавить элемент Avalon UserControl. Будут созданы файлы UserControl1.xaml и UserControl1.xaml.cs. Затем в файл UserControl1.xaml можно добавить код XAML для описания элемента управления. Далее можно просто создать экземпляр этого элемента управления и добавить его в элемент управления ElementHost, как в следующем примере.

ElementHost host = new ElementHost();

UserControl1 uc1 = new UserControl1();

host.Controls.Add(uc1);

host.Dock = DockStyle.Fill;

this.panel1.Controls.Add(host);

Кроме того, потребуется изменить файл проекта, поскольку приложение Windows Forms не знает, что делать с файлом XAML. Откройте файл проекта (.csproj, .vbproj и т. д.) в текстовом редакторе, например в «Блокноте», и перейдите в конец файла. Там будет содержаться следующая строка:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

Необходимо скопировать эту строку и вставить ее под следующей строкой, а затем заменить CSharp на WinFX. Эти две строки будут выглядеть следующим образом:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

<Import Project="$(MSBuildBinPath)\Microsoft.WinFx.targets" />

Сохраните файл, снова загрузите проект в VS и запустите приложение.

 

Вопрос. Как приступить к работе с этой технологией?

Ответ. Установите .Net Framework 4.0.

 

Вопрос. Куда можно сообщать об обнаруженных ошибках?

Ответ. Обращайтесь в центр обратной связи по продуктам MSDN. Выберите в качестве названия продукта Windows Presentation Foundation (WPF).

 

Вопрос. Будет ли выпущено средство для преобразования приложений Windows Forms в приложения WPF?

Ответ. На данный момент выпуск такого средства не планируется. Мы считаем более важным предложить решение, которое обеспечивает сосуществование элементов управления Windows Forms и WPF, а не пытаться создать труднореализуемое средство миграции.

 

Вопрос. Когда будет выпущена эта технология?

Ответ. Она появится в следующей версии Visual Studio с кодовым названием Orcas.

 

Вопрос. Где можно найти документацию?

Ответ. Документацию можно найти в библиотеке MSDN.