Как подключить элементы windows forms к wpf

Обновлено: 08.07.2024

Как поместить элемент управления WPF в форму Windows Forms? Скорее всего, я буду вставлять свой элемент управления WPF в Windows.Формы.Панель.

поставить ElementHost управление внутри панели. Затем этот элемент управления может содержать элемент WPF. В конструкторе WinForms этот элемент управления можно найти в разделе "Взаимодействие WPF".

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

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

кроме того, вам нужно будет изменить файл проекта, потому что приложение Windows не делает, что делать с файлом XAML. Вам нужно будет открыть файл проекта (.csproj файл, .vbproj и т. д.) в редакторе, как блокнот, а затем прокрутите вниз. Вы увидите следующую строку:

вам нужно будет скопировать эту строку и вставить ее просто ниже приведенной выше строки, а затем измените "CSharp" на "WinFX", чтобы две строки выглядели так:

теперь сохраните этот файл и перезагрузите проект с помощью VS и запустите приложение.

обобщая ответы для быстрой справки:

Если вы не хотите возиться с редактированием проекта и хотите придерживаться дизайнера:

обязательно добавьте ссылку на WindowsFormsIntegration.dll, которая обычно из окна \reference assemblies\microsoft\Framework.

и если вы используете WPF usercontrol в своем решении, у вас, вероятно, уже есть ссылки на

WPF и Windows Forms представляют две разные архитектуры для создания интерфейсов приложений. System.Windows.Forms.IntegrationПространство имен предоставляет классы, обеспечивающие общие сценарии взаимодействия. Двумя ключевыми классами, реализующими возможности взаимодействия, являются WindowsFormsHost и ElementHost . В этом разделе описано, какие сценарии взаимодействия поддерживаются, а какие нет.

Особое внимание уделено сценарию гибридного элемента управления. Гибридный элемент управления — это элемент управления на основе одной технологии, в который вложен элемент управления на основе другой технологии. Это также называется вложенным взаимодействием. В многоуровневом гибридном элементе управления более одного уровня вложения. Примером многоуровневого вложенной операции является элемент управления Windows Forms, содержащий WPF элемент управления, который содержит другой элемент управления Windows Forms. Многоуровневые гибридные элементы управления не поддерживаются.

Размещение элементов управления Windows Forms в WPF

При размещении элемента управления Windows Forms поддерживаются следующие сценарии взаимодействия WPF :

WPFЭлемент управления может содержать один или несколько элементов управления Windows Forms с помощью XAML.

В нем может размещаться один или несколько элементов управления Windows Forms с помощью кода.

В нем могут размещаться Windows Forms контейнерные элементы управления, которые содержат другие элементы управления Windows Forms.

В ней может размещаться форма «основной/подробности WPF » с главным и Windows Forms сведениями.

В нем может размещаться форма «основной/подробности» с Windows Forms главным и WPF подробными сведениями.

В ней может размещаться один или несколько элементов управления ActiveX.

В него могут быть вложены один или несколько составных элементов управления.

С помощью Язык XAML в него могут быть вложены гибридные элементы управления.

С помощью кода в него могут быть вложены гибридные элементы управления.

Поддержка макета

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

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

Элементы управления Windows Forms нельзя поворачивать или расклонять. Например, при повороте пользовательского интерфейса на 90 градусов размещаемые элементы управления Windows Forms будут поддерживать свое вертикальное расположение.

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

В пользовательском интерфейсе WPF можно изменить z-порядок элементов для контроля поведения перекрывания. Размещенный элемент управления Windows Forms рисуется в отдельном HWND, поэтому он всегда рисуется поверх WPF элементов.

Windows Forms элементы управления поддерживают автомасштабирование на основе размера шрифта. В пользовательском интерфейсе WPF изменение размера шрифта не влечет за собой изменение размера всего макета, хотя отдельные элементы могут динамически изменять размер.

Внешние свойства

Некоторые свойства окружения WPF элементов управления имеют Windows Forms эквиваленты. Эти внешние свойства распространяются на размещенные элементы управления Windows Forms и предоставляются как общие свойства WindowsFormsHost элемента управления. WindowsFormsHostЭлемент управления преобразует каждое WPF внешнее свойство в его Windows Forms эквивалент.

Поведение

В приведенной ниже таблице описаны возможности взаимодействия.

Переход от WPF элемента управления к Windows Forms элементу управления с клавишей TAB и Shift + Tab работает как обычно.

Windows Forms элементы управления, имеющие TabStop значение свойства, false не получают фокус при использовании вкладок пользователя через элементы управления.

Размещение элементов управления WPF в Windows Forms

При размещении элемента управления Windows Forms поддерживаются следующие сценарии взаимодействия WPF :

Вложение одного или нескольких элементов управления WPF с помощью кода.

Связывание страницы свойств с одним или несколькими вложенными элементами управления WPF.

Вложение одной или нескольких страниц WPF в форму.

Запуск окна WPF.

Размещение формы «основной/подробности» с Windows Forms главным и WPF подробными сведениями.

Размещение формы «основной/подробности» с WPF главной и Windows Forms сведениями.

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

Вложение гибридных элементов управления.

Внешние свойства

Некоторые свойства окружения элементов управления Windows Forms имеют WPF эквиваленты. Эти внешние свойства распространяются на размещенные WPF элементы управления и предоставляются как общие свойства ElementHost элемента управления. ElementHostЭлемент управления преобразует каждое Windows Forms внешнее свойство в его WPF эквивалент.

Привязать элементы управления к перечислителю
Есть 6 штук Radiobutton, у каждого есть имя. Есть перечислитель и свойство: public enum Animal.

ChildWindow не отображает элементы управления
Доброго дня всем! Такая проблема, делаю по следующему пособию Долженко.

Вопрос. Как можно разместить элемент управления 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

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

// in this case it's a Grid

Если используется 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, сопоставленные с этими префиксами.

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

Перед тем как использовать WindowsFormsHost и элементы управления WinForms, необходимо добавить ссылку на следующие сборки в вашем приложении:

  • WindowsFormsIntegration
  • System.Windows.Forms

В Visual Studio это можно сделать следующим образом: в "Обозревателе решений" необходимо кликнуть правой клавишей мыши по элементу "Ссылки (References)" вашего проекта и выбрать "Добавить ссылку (Add reference)":


В появившемся диалоговом окне необходимо выбрать "Сборки (Assemblies)" и затем поставить галочки напротив двух сборок, которые нам необходимо добавить:


Использование WinForms-элемента WebBrowser

В предыдущем разделе для создания небольшого веб-браузера мы использовали WPF-элемент WebBrowser. Однако, как было сказано в той статье, WPF-элемент WebBrowser обладает некоторыми ограничениями в сравнении с WinForms-версией данного элемента. Существует множество примеров вещей, которые можно легко реализовать с использованием WinForms-версии, и которые сложно либо и вовсе невозможно реализовать с помощью WPF версии.

В качестве небольшого примера рассмотрим свойство DocumentTitle и соответствующее событие DocumentTitleChanged, которые позволяют легко получать и обновлять заголовок окна в соответствии с заголовком текущей веб-страницы. Будем считать это достаточно оправдывающей причиной для того, чтобы попробовать в действии WinForms-версию данного элемента прямо здесь, в нашем WPF-приложении:


Особое внимание следует уделить здесь строке кода, где мы добавляем пространство имен WinForms в данном окне, чтобы мы имели возможность ссылаться на нужные элементы:

Это позволит нам обращаться к элементам WinForms, используя префикс wf:

Как видите, WindowsFormsHost достаточно прост в использовании. У него есть свойство Child,где вы можете определить единственный элемент WinForms. Это очень напоминает то, как Окно WPF может содержать только один корневой элемент. Если вам необходимо использовать более одного элемента из WinForms внутри вашего WindowsFormsHost, вы можете использовать WinForms-элемент Panel или любой другой элемент-контейнер.

WinForms-элемент WebBrowser можно использовать благодаря ссылке на сборку System.Windows.Forms, используя префикс wf, как ранее объяснялось.

В Code-behind мы один раз при инициализации вызываем метод Navigate, чтобы при запуске приложения вместо пустого окна у нас отобразилась полноценная веб-страница. Затем мы реализуем обработчик события DocumentTitleChanged, в котором мы обновляем свойство Title нашего окна Window в соответствии с текущим значением DocumentTitle элемента WebBrowser.

Поздравляю! Теперь мы имеем WPF-приложение, которое содержит внутри себя WinForms-элемент WebBrowser.

Как видите, нет никаких сложностей в использовании элементов WinForms внутри WPF-приложений. Но остается вопрос: нужно ли так делать?

В конце концов, решение остается за вами - действительно ли вам нужно использовать элементы WinForms, либо стоит применить альтернативное WPF-решение, которое может работать также неплохо?

Интеграция с Windows Forms

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

Интеграция Windows Forms и WPF сталкивается с серьезнеем препятствием. Если вы интегрируете Windows Forms с WWPF, то элементы управления Windows Forms выглядят так, как они выглядели в прежние времена. Элементы управления и приложения Windows Forms не могут иметь современный внешний вид WWPF. Поэтому с точки зрения пользовательского интерфейса может быть лучше полностью переписать пользовательский интерфейс.


Элементы управления WPF в приложениях Windows Forms

Начнем с простейшего элемента управления WPF. С помощью Visual Studio 2008 вы можете создать библиотеку WPF User Control Library. Наш пример элемента управления унаследован от базового класса UserControl и содержит сетку (grid) и кнопку со специальным содержимым.

<Canvas Height= 230 Width= 230 >

<Ellipse Canvas.Left= 50 Canvas.Top= 50 Width= 100 Height= 100

Stroke= Blue StrokeThickness= 4 Fill= Yellow /> <Ellipse Canvas.Left= 60 Canvas.Top= 65 Width= 25 Height= 25

Stroke= Blue StrokeThickness= 3 Fill= White />

<Ellipse Canvas.Left= 70 Canvas.Top= 75 Width= 5 Height= 5 Fill= Black /> <Path Name= mouth Stroke= Blue StrokeThickness= 4

Data= M 62,125 Q 95,122 102,108 /> <Line X1= 124 X2= 132 Y1= 144 Y2= 166 Stroke= Blue StrokeThickness= 4 /> <Line X1= 114 X2= 133 Y1= 169 Y2= 166 Stroke= Blue StrokeThickness= 4 />

<Line X1= 92 X2= 82 Y1= 146 Y2= 168 Stroke= Blue StrokeThickness= 4 /> <Line X1= 68 X2= 83 Y1= 160 Y2= 168 Stroke= Blue StrokeThickness= 4 />

Вы можете создать приложение Windows Forms, выбрав шаблон приложения Windows Forms. Поскольку проект пользовательского элемента управления WPF находится в том же решении, что и приложение Windows Forms, вы можете перетащить пользовательский элемент управления WPF из панели инструментов на поверхность проектирования приложения Windows Forms. Это добавит ссылку на сборки PresentationCore, PresentationFramework, WindowsBase, WindowsFormsIntegration и, конечно же, на сборку, содержащую элемент управления WPF.

Внутри сгенерированного дизайнером кода вы найдете переменную, ссылающуюся на пользовательский элемент WPF и объект типа ElementHost, который служит для него оболочкой:

В методе InitializeComponent вы можете видеть инициализацию объекта и присвоение экземпляра элемента управления WPF свойству Child класса ElementHost:

private void InitializeComponent()

this.elementHost1.Location = new System.Drawing.Point(39, 44); this.elementHost1.Name = elementHost1 ;

this.elementHost1.Size = new System.Drawing.Size(259, 229);

Запустив это приложение Windows Forms, вы увидите рядом внутри формы элемент управления WPF и обычный элемент управления Windows Forms, как показано на рис. 35.28.

Конечно же, вы можете добавлять методы, свойства и события в элемент управления WPF и использовать их точно так же, как и во всех других элементах управления.

Элементы управления Windows Forms в приложениях WPF

Вы можете интегрировать Windows Forms и WPF также и в противоположном направлении: помещая элемент управления Windows Forms в приложение WPF. Как и в случае использования класса ElementHost для создания оболочки для элемента

управления WPF внутри приложения Windows Forms, здесь вам также понадобится класс, позволяющий поместить элемент управления Windows Forms в среду приложения WPF. Этот класс называется WindowsFormsHost и находится он в той же сборке WindowsFormsIntegration. Класс WindowsFormsHost унаследован от базовых классов HwndHost и FrameworkElement, а потому может быть использован как элемент WPF.


Рис. 35.28. Пример применения элементов управления WPF в приложении Windows Forms

Для такой интеграции сначала создается библиотека Windows Control Library. Добавьте элементы TextBox и Button к форме, используя визуальный дизайнер. Чтобы изменить свойство Text кнопки, в отделенный код добавляется свойство

public partial class UserControl1 : UserControl

public string ButtonText

<Window x:Class= WPFApplication.Window1

xmlns:winforms= clr-namespace:Wrox.ProCSharp.WPF;assembly=WindowsFormsControl Title= WPF Interop Application Height= 300 Width= 300

<WindowsFormsHost Grid.Row= 0 Height= 180 >

<winforms:UserControl1 x:Name= myControl ButtonText= Click Me! /> </WindowsFormsHost>

<StackPanel Grid.Row= 1 > <TextBox Margin= 5,5,5,5 Height= 30 ></TextBox> <Button Margin= 5,5,5,5

WPF Button</Button> </StackPanel> </Grid> </Window>

Width= 80 Height= 40 >

На рис. 35.29 показано, как выглядит приложение WPF. Разумеется, элемент управления Windows Forms по-прежнему выглядит как элемент управления Windows Forms и не обладает возможностями изменения размеров и стилизации, которые предоставляет WPF.


Рис. 35.29. Пример применения элементов управления Windows Forms в приложении WPF

Читайте также: