web-dev-qa-db-fra.com

Placez le contrôle WPF dans un formulaire Windows Forms

Comment mettez-vous un contrôle WPF dans un formulaire Windows Forms? Très probablement, je vais insérer mon contrôle WPF dans un Windows.Forms.Panel. 

30
Darkhydro

Placez une commande ElementHost à l'intérieur du panneau. Ce contrôle peut ensuite héberger un élément WPF. A partir du concepteur WinForms, vous pouvez trouver ce contrôle sous 'Interopérabilité WPF'. Vous devez d’abord ajouter WindowsFormsIntegration.dll aux références de votre projet.

Pour un exemple, voir Procédure pas à pas: hébergement d'un contrôle composite WPF dans Windows Forms .

34
Ani

Essayez de lire ceci:
Hébergement d’un contrôle WPF dans une application Windows Forms
http://community.infragistics.com/wpf/articles/hosting-a-wpf-control-in-a-windows-forms-application.aspx

Commencez par ajouter des références aux espaces de noms WPF (PresentationCore, PresentationFramework, UIAutomationProvider, UIAutomationTypes et WindowsBase). Créez ensuite une instance du contrôle ElementHost et du contrôle que vous souhaitez incorporer dans l'application Windows Forms, puis connectez ce contrôle au contrôle ElementHost. Ensuite, ajoutez simplement le contrôle ElementHost à votre collection de contrôles de formulaires:

    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);

Toutefois, si vous souhaitez utiliser XAML pour décrire le contrôle WPF que vous souhaitez utiliser dans l'application Windows Forms, vous devez ajouter un élément Avalon UserControl à votre projet. Cela créera un fichier UserControl1.xaml et un fichier UserControl1.xaml.cs. Vous pouvez ensuite modifier le fichier UserControl1.xaml pour qu'il contienne le code XAML que vous souhaitez décrire. Ensuite, il vous suffirait de créer une instance de ce contrôle et de l’ajouter au 

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);

En outre, vous devrez modifier le fichier de projet, car l'application Windows ne sait pas quoi faire avec le fichier XAML. Vous devrez ouvrir le fichier de projet (.csproj, .vbproj, etc.) dans un éditeur tel que Notepad, puis faites défiler vers le bas. Vous verrez la ligne suivante:

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

Vous devrez copier cette ligne et la coller juste en dessous de la ligne ci-dessus, puis remplacer "CSharp" par "WinFX" afin que les deux lignes ressemblent à ceci:

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

Enregistrez maintenant ce fichier, rechargez le projet à l’aide de VS et lancez l’application.



Source: http://windowsclient.net/learn/integration.aspx

4
Sergey Gavruk

Résumant les réponses ci-dessus pour une référence rapide:

si vous ne voulez pas vous occuper de l'édition du projet et que vous voulez vous en tenir au concepteur:

assurez-vous d’ajouter une référence pour WindowsFormsIntegration.dll qui provient normalement de\reference assemblies\Microsoft\Framework de la fenêtre ...

et si vous utilisez un wpf usercontrol dans votre solution, vous avez probablement déjà des références à 

System.Windows.Presentation, System.Windows.Activities, System.Windows.CompnentModel, System.Windows..RunTime, System.Windows.WorkFlowServices, System.Xaml.

sinon, veillez à ajouter les références précédentes requises.

dans un membre du formulaire Windows, ajoutez le wpf usercontrol myWpfUsrCtl au formulaire Windows comme suit

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
}
0
gg89