Как вы помещаете элемент управления WPF в форму Windows Forms? Скорее всего, я буду вставлять свой WPF-элемент в Windows.Forms.Panel.
Поместите элемент управления WPF в форму Windows Forms
Ответ 1
Поместите элемент управления ElementHost
внутри панели. Затем этот элемент управления может содержать элемент WPF. Из конструктора WinForms вы можете найти этот элемент управления в разделе "WPF Interoperability". Сначала вам может потребоваться добавить WindowsFormsIntegration.dll в ссылки на проект.
Например, см. Пошаговое руководство. Хостинг WPF Composite Control в Windows Forms.
Ответ 2
Попробуйте прочитать следующее:
Хостинг WPF-элемента управления в приложении Windows Forms
http://community.infragistics.com/wpf/articles/hosting-a-wpf-control-in-a-windows-forms-application.aspx
Сначала добавьте ссылки на пространства имен WPF (PresentationCore, PresentationFramework, UIAutomationProvider, UIAutomationTypes и WindowsBase). Затем создайте экземпляр элемента управления ElementHost и элемент управления, который вы хотите встроить в приложение Windows Forms, а затем подключите этот элемент управления до элемента управления ElementHost. Затем просто добавьте элемент управления ElementHost в коллекцию управления Forms:
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);
Однако, если вы хотите использовать XAML
для описания элемента управления WPF, который вы хотите использовать в приложении Windows Forms, вам нужно добавить элемент Avalon UserControl в свой проект. Это создаст файл UserControl1.xaml
и файл UserControl1.xaml.cs
. Затем вы можете изменить файл UserControl1.xaml, чтобы указать любой XAML, который вы хотите описать вашим элементом управления. Затем вы просто создадите экземпляр этого элемента управления и добавьте его в
ElementHost control as in the above example:
ElementHost host = new ElementHost();
UserControl1 uc1 = new UserControl1();
host.Controls.Add(uc1);
host.Dock = DockStyle.Fill;
this.panel1.Controls.Add(host);
Кроме того, вам нужно будет изменить файл проекта, потому что приложение Windows не имеет никакого отношения к файлу XAML. Вам нужно будет открыть файл проекта (.csproj,.vbproj и т.д.) В редакторе, таком как "Блокнот", а затем прокрутите вниз. Вы увидите следующую строку:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Вам нужно будет скопировать эту строку и вставить ее чуть ниже указанной строки, а затем изменить "CSharp" на "WinFX", чтобы две строки выглядели следующим образом:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.WinFx.targets" />
Теперь сохраните этот файл и перезагрузите проект с помощью VS и запустите приложение.
Ответ 3
Обобщая вышеприведенные ответы для краткого ознакомления:
если вы не хотите возиться с редактированием проекта и хотите остаться с дизайнером:
обязательно добавьте ссылку на WindowsFormsIntegration.dll
которая обычно находится в окне\справочные сборки \microsoft\Framework...
и если вы используете wpf usercontrol в своем решении, вы, вероятно, уже получили ссылки на
System.Windows.Presentation, System.Windows.Activities, System.Windows.CompnentModel, System.Windows..RunTime, System.Windows.WorkFlowServices, System.Xaml.
в противном случае обязательно добавьте необходимые исходящие ссылки.
в элементе формы Windows вы добавляете wpf usercontrol myWpfUsrCtl в форму окна следующим образом
void addWpfUsrCntl()
{
var elemthost1 = new System.Windows.Forms.Integration.ElementHost();
elemthost1.Dock = DockStyle.None; // change to to suit your need
// you can add the WPF control to the form or any other desired control
elemthost1.Parent = this;
//elemthost1.AutoSize = true; // change to to suit your need
FinCurl_.AutoSize = true; // change to to suit your need
elemthost1.Child = myWpfUsrCtl; // Assign the WPF control
}