FAQ по интеграции WinForms и WPF
Как можно сохранить инвестиции, сделанные в приложения 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. |